diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index dd6f606e6..5daa925f4 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -15,7 +15,7 @@ permissions: env: DOTNET_VERSION: 10.0.x CONFIGURATION: Release - EXPECTED_VERSION: 1.29.1 + EXPECTED_VERSION: 1.29.2 PACKAGE_CANDIDATE_ARTIFACT: icod-terminal-main-package-candidate jobs: diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index 368b9817e..c4580d474 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -39,7 +39,7 @@ jobs: if: runner.os == 'Windows' shell: powershell run: ./packaging/VerifyLicenseHeaders.ps1 - - name: Verify native Windows console input and cancellation + - name: Verify native Windows console I/O and restoration if: runner.os == 'Windows' timeout-minutes: 3 shell: pwsh diff --git a/CHANGELOG.md b/CHANGELOG.md index ed643cfb5..80c451c49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,22 @@ Notable changes to `Icod.Terminal` are recorded here for consumers who need a concise release history. Detailed design evidence remains in the versioned roadmaps, tranche records, and public-API baseline documents. +## 1.29.2 + +- Configure system-backed Windows console output for UTF-8 while a session owns + it, preventing UTF-8 box-drawing bytes from being decoded as multiple OEM + characters and breaking terminal-cell geometry. +- Restore the exact prior Windows console output code page during disposal, + failed setup, lifecycle release and lifecycle re-entry. +- Make Windows Raw and CBreak modes enable virtual-terminal and mouse input, + enable extended mode flags, and suppress Quick Edit while active. +- Preserve canonical-mode policy, unrelated console-mode flags, raw Ctrl+C and + Ctrl+Z handling, and exact captured-mode restoration. +- Add cross-target unit coverage and an isolated native Windows console smoke + for UTF-8 box drawing, mouse-mode ownership, control keys and restoration. +- Preserve the public API, .NET 8/9/10 targets and production dependencies. + See [1.29.2 release notes](docs/releases/1.29.2.md). + ## 1.29.1 - Decode legacy Escape-prefixed Alt letters as a single modified key, including @@ -150,7 +166,7 @@ Notable changes to `Icod.Terminal` are recorded here for consumers who need a co - Retains production dependencies `Icod.TermInfo 1.15.0` and `Icod.Timing 1.0.0`. - Qualifies fresh package consumers, published `Icod.DCurses 1.6.0` compatibility, and a separate TermInfo-free future-renderer package consumer on all target frameworks. -See `docs/releases/1.18.0.md`, `docs/Public-API-Baseline-1.18.md`, and `Icod.Terminal-1.18.0-Development-Roadmap.md` for the complete contract. +See `docs/releases/1.18.0.md`, `docs/Public-API-Baseline-1.18.md`, and `docs/Icod.Terminal-1.18.0-Development-Roadmap.md` for the complete contract. ## 1.17.1 @@ -182,7 +198,7 @@ See `docs/releases/1.17.1.md` for the complete patch-release notes. - Advances the production dependency to `Icod.TermInfo 1.15.0` while retaining `Icod.Timing 1.0.0`; the new screen contracts expose no TermInfo types. - Aligns optional integration tests and samples with `Icod.TermInfo.Inspection 1.15.0` without adding Inspection or Source to the production graph. -See `docs/releases/1.17.0.md`, `docs/Public-API-Baseline-1.17.md`, and `Icod.Terminal-1.17.0-Development-Roadmap.md` for the complete 1.17 contract. +See `docs/releases/1.17.0.md`, `docs/Public-API-Baseline-1.17.md`, and `docs/Icod.Terminal-1.17.0-Development-Roadmap.md` for the complete 1.17 contract. ## 1.16.0 @@ -208,7 +224,7 @@ See `docs/releases/1.17.0.md`, `docs/Public-API-Baseline-1.17.md`, and `Icod.Ter - Finalizes the 1.16 public API fingerprint as `d2acfa85aad87c739b3f682096d4d7139627f12bc9d8981b65529eeb79a2da8d` while retaining all historical baselines unchanged. - Continues to exclude frame composition/delta editing, partial-frame updates, gapless composition frames, absolute or pixel-within-cell placement, automatic image decoding, Terminal-owned scene/window/cell/damage/layout/timeline policy, public protocol identities, hidden replay caches, and PTY/ConPTY hosting. -See `docs/releases/1.16.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.16.md`, and `Icod.Terminal-1.16.0-Development-Roadmap.md` for the complete 1.16 contract. +See `docs/releases/1.16.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.16.md`, and `docs/Icod.Terminal-1.16.0-Development-Roadmap.md` for the complete 1.16 contract. ## 1.15.0 @@ -237,7 +253,7 @@ See `docs/releases/1.16.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Publ - Finalizes the 1.15 public API fingerprint as `eb361cef615fda97ac2c0ef9da8ea3d63fdc1f537ec438164bcb93694eecd13d` while retaining all historical baselines unchanged. - Continues to exclude animation/frame ownership, absolute screen-coordinate layout, pixel-within-cell positioning, Terminal-owned scene/window/cell/damage policy, public protocol identities, generic raw Kitty dispatch, hidden replay caches, image decoding/transcoding, and PTY/ConPTY hosting. -See `docs/releases/1.15.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.15.md`, and `Icod.Terminal-1.15.0-Development-Roadmap.md` for the complete 1.15 contract. +See `docs/releases/1.15.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.15.md`, and `docs/Icod.Terminal-1.15.0-Development-Roadmap.md` for the complete 1.15 contract. ## 1.14.0 @@ -265,7 +281,7 @@ See `docs/releases/1.15.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Publ - Uses production dependencies `Icod.TermInfo 1.13.0` and `Icod.Timing 1.0.0`. - Continues to exclude passive terminal-side existence probes, public protocol/generation identities, reparenting, Unicode placeholder placement, animation/frame lifecycle, absolute or pixel-within-cell placement, scene ownership, automatic replay, image decoding/transcoding, and PTY/ConPTY hosting. -See `docs/releases/1.14.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.14.md`, and `Icod.Terminal-1.14.0-Development-Roadmap.md` for the complete 1.14 contract. +See `docs/releases/1.14.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.14.md`, and `docs/Icod.Terminal-1.14.0-Development-Roadmap.md` for the complete 1.14 contract. ## 1.13.0 @@ -290,7 +306,7 @@ See `docs/releases/1.14.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Publ - Updates the production dependency to `Icod.TermInfo 1.12.0` while retaining `Icod.Timing 1.0.0`. - Continues to exclude reparenting, public protocol/parent identities, Unicode placeholder placement, animation/frame lifecycle, absolute screen-coordinate layout, pixel-within-cell positioning, scene ownership, automatic replay, image decoding/transcoding, and PTY/ConPTY hosting. -See `docs/releases/1.13.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.13.md`, and `Icod.Terminal-1.13.0-Development-Roadmap.md` for the complete 1.13 contract. +See `docs/releases/1.13.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.13.md`, and `docs/Icod.Terminal-1.13.0-Development-Roadmap.md` for the complete 1.13 contract. ## 1.12.0 @@ -315,7 +331,7 @@ See `docs/releases/1.13.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Publ - Preserves production dependencies at `Icod.TermInfo 1.11.0` and `Icod.Timing 1.0.0`. - Continues to exclude automatic replay, Sixel persistent-resource emulation, public protocol ids, relative placement graphs, absolute screen-coordinate layout, Unicode placeholders, animation/frame lifecycle, image decoding/transcoding, and PTY/ConPTY hosting. -See `docs/releases/1.12.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.12.md`, and `Icod.Terminal-1.12.0-Development-Roadmap.md` for the complete 1.12 contract. +See `docs/releases/1.12.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.12.md`, and `docs/Icod.Terminal-1.12.0-Development-Roadmap.md` for the complete 1.12 contract. ## 1.11.1 @@ -337,7 +353,7 @@ See `docs/releases/1.12.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Publ - T1111-A through T1111-D completed full pull-request qualification on exact head `651af888875a0d2acababe46a4e1313532ec7ba6` in workflow `#1628 / 34704455179`. - Deliberately defers a table-driven `TerminalTermInfoSemanticEvidence` cleanup, static lifecycle-evidence ingestion, and any adapter package to later independent design work. -See `docs/releases/1.11.1.md` and `Icod.Terminal-1.11.1-Development-Roadmap.md` for the complete patch-release integration contract. +See `docs/releases/1.11.1.md` and `docs/Icod.Terminal-1.11.1-Development-Roadmap.md` for the complete patch-release integration contract. ## 1.11.0 @@ -368,7 +384,7 @@ See `docs/releases/1.11.1.md` and `Icod.Terminal-1.11.1-Development-Roadmap.md` - Finalizes the 1.11 public API fingerprint as `9336a1f6def1c4b02e86db813bae27f45b95af33f47a2cf10dccd4d1d44324f2` while retaining all historical baselines unchanged. - Deliberately excludes automatic replay, Sixel persistence emulation, public protocol ids, source rectangles, z-order, Unicode placeholders, relative/pixel placement, animation, scene-graph ownership, image decoding/transcoding, and PTY/ConPTY hosting. -See `docs/releases/1.11.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.11.md`, `docs/C118-1.11.0-Persistent-Raster-Adversarial-Downstream-and-Package-Qualification.md`, `docs/C119-1.11.0-Release-Closure.md`, and `Icod.Terminal-1.11.0-Development-Roadmap.md` for the complete 1.11 contract. +See `docs/releases/1.11.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Public-API-Baseline-1.11.md`, `docs/C118-1.11.0-Persistent-Raster-Adversarial-Downstream-and-Package-Qualification.md`, `docs/C119-1.11.0-Release-Closure.md`, and `docs/Icod.Terminal-1.11.0-Development-Roadmap.md` for the complete 1.11 contract. ## 1.10.0 @@ -397,7 +413,7 @@ See `docs/releases/1.11.0.md`, `docs/Persistent-Raster-Ownership.md`, `docs/Publ - Retains `net8.0`, `net9.0`, and `net10.0`, Windows/Linux/macOS runtime validation, existing `Icod.DCurses` acceptance/soak witnesses, and the stable `1.0.0` compatibility floor. - Adds no public protocol-backend selector, raw evidence ledger, arbitrary terminfo-capability-name API, terminal-brand heuristic, or requirement that every semantic capability have a live probe. -See `docs/releases/1.10.0.md`, `docs/Capability-Inspection-and-Planning.md`, `docs/Public-API-Baseline-1.10.md`, `docs/C101-Semantic-Capability-Vocabulary-and-API-Regret-Gate.md`, `docs/C105-C108-Capability-Lifecycle-Samples-Hardening-and-API-Freeze.md`, and `Icod.Terminal-1.10.0-Development-Roadmap.md` for the complete 1.10 contract. +See `docs/releases/1.10.0.md`, `docs/Capability-Inspection-and-Planning.md`, `docs/Public-API-Baseline-1.10.md`, `docs/C101-Semantic-Capability-Vocabulary-and-API-Regret-Gate.md`, `docs/C105-C108-Capability-Lifecycle-Samples-Hardening-and-API-Freeze.md`, and `docs/Icod.Terminal-1.10.0-Development-Roadmap.md` for the complete 1.10 contract. ## 1.9.0 @@ -428,7 +444,7 @@ See `docs/releases/1.10.0.md`, `docs/Capability-Inspection-and-Planning.md`, `do - Intentionally advances the final public API fingerprint to `e652e6fd65cd43422ca84b7c4c2a1815ee7ead9b2a64285e0e17cf39614b0315` while retaining every historical baseline unchanged. - Retains the stable `1.0.0` compatibility floor, Windows/Linux/macOS runtime validation, current `Icod.DCurses` acceptance/soak witnesses, and the `Icod.TermInfo 1.10.0` / `Icod.Timing 1.0.0` dependency floor. -See `docs/releases/1.9.0.md`, `docs/Public-API-Baseline-1.9.md`, `docs/E190-Unsolicited-Semantic-Event-Contract-and-Reference-Freeze.md` through `docs/E199-1.9.0-Public-API-Documentation-Compatibility-and-Release-Closure.md`, and `Icod.Terminal-1.9.0-Development-Roadmap.md` for the complete 1.9 contract. +See `docs/releases/1.9.0.md`, `docs/Public-API-Baseline-1.9.md`, `docs/E190-Unsolicited-Semantic-Event-Contract-and-Reference-Freeze.md` through `docs/E199-1.9.0-Public-API-Documentation-Compatibility-and-Release-Closure.md`, and `docs/Icod.Terminal-1.9.0-Development-Roadmap.md` for the complete 1.9 contract. ## 1.8.1 @@ -480,7 +496,7 @@ See `docs/releases/1.8.1.md` for the curated maintenance release notes. - Extends the fresh NuGet-only raster package smoke so both DCS/Sixel-specific and APC/Kitty-specific public escape-hatch method names remain excluded from the shipped API while the same public raster contract compiles/runs on all three TFMs. - A180–A189 completed exact-head Staging qualification before PR #46 was merged; `v1.8.0` was subsequently tagged and published as the stable multi-backend raster release. -See `docs/releases/1.8.0.md`, `docs/A180-APC-Construction-Contract-and-Reference-Freeze.md` through `docs/A189-1.8.0-Package-Documentation-Compatibility-and-Release-Closure.md`, and `Icod.Terminal-1.8.0-Development-Roadmap.md` for the complete 1.8 contract. +See `docs/releases/1.8.0.md`, `docs/A180-APC-Construction-Contract-and-Reference-Freeze.md` through `docs/A189-1.8.0-Package-Documentation-Compatibility-and-Release-Closure.md`, and `docs/Icod.Terminal-1.8.0-Development-Roadmap.md` for the complete 1.8 contract. ### Prior release history diff --git a/Directory.Build.props b/Directory.Build.props index 01d918986..5910badd0 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 1.29.1 + 1.29.2 $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix) $(Version) diff --git a/Icod.Terminal.csproj b/Icod.Terminal.csproj index 0aec22ec5..aa442278b 100644 --- a/Icod.Terminal.csproj +++ b/Icod.Terminal.csproj @@ -39,7 +39,7 @@ Icod.Terminal Timothy J. Bruce Managed, cross-platform live-terminal session, endpoint, mode, input, lifecycle, and terminal-control foundation for .NET. - 1.29.1 decodes legacy Escape-prefixed Alt characters, including fragmented Unicode, and preserves Ctrl+Z and Unicode on Windows using direct ReadConsoleW input. Raw sessions expose Ctrl+C and Ctrl+Z as application keys; CBreak retains host control handling. Adds cancellation-safe owned console reads, Rich Input sample checks, Unix PTY coverage, and a native Windows console regression smoke. No public API or dependency changes. Release notes: https://github.com/uniblab/Icod.Terminal/blob/main/docs/releases/1.29.1.md. Compatibility policy: https://github.com/uniblab/Icod.Terminal/blob/main/docs/Compatibility-and-Versioning.md. + 1.29.2 makes system-backed Windows sessions reversibly enable UTF-8 console output so byte-oriented Unicode, including box drawing, retains one-cell geometry. Raw and CBreak modes explicitly own mouse input and suppress Quick Edit while active, restoring the exact prior console mode afterward. Adds native Windows console I/O and restoration coverage. No public API or dependency changes. Release notes: https://github.com/uniblab/Icod.Terminal/blob/main/docs/releases/1.29.2.md. Compatibility policy: https://github.com/uniblab/Icod.Terminal/blob/main/docs/Compatibility-and-Versioning.md. README.md icon.png https://github.com/uniblab/Icod.Terminal diff --git a/README.md b/README.md index d4990b34c..1ef467bc7 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ ## Status -Stable release: **1.29.1**. The stable **1.0.0 compatibility floor** remains unchanged. +Stable release: **1.29.2**. The stable **1.0.0 compatibility floor** remains unchanged. -See the [1.29.1 release notes](https://github.com/uniblab/Icod.Terminal/blob/main/docs/releases/1.29.1.md), +See the [1.29.2 release notes](https://github.com/uniblab/Icod.Terminal/blob/main/docs/releases/1.29.2.md), [changelog](https://github.com/uniblab/Icod.Terminal/blob/main/CHANGELOG.md) for release history, -the [development roadmap](https://github.com/uniblab/Icod.Terminal/blob/main/Icod.Terminal-Development-Roadmap.md) +the [development roadmap](https://github.com/uniblab/Icod.Terminal/blob/main/docs/Icod.Terminal-Development-Roadmap.md) for current work, and the [compatibility policy](https://github.com/uniblab/Icod.Terminal/blob/main/docs/Compatibility-and-Versioning.md) for support guarantees. @@ -65,7 +65,7 @@ See [`docs/Architecture.md`](docs/Architecture.md) for the permanent architectur Install the stable release: ```text -dotnet add package Icod.Terminal --version 1.29.1 +dotnet add package Icod.Terminal --version 1.29.2 ``` The partial animation-frame API requires `Icod.Terminal 1.23.0` or later. The geometry and planning APIs described below require `Icod.Terminal 1.24.0` or later. @@ -400,11 +400,18 @@ Unicode to UTF-8 for the common decoder. Cancellation finishes the outstanding native read before its owned handle is closed. Sessions opened with explicit byte services retain their existing borrowed-transport behavior. +For system-backed Windows console output, the session enables virtual-terminal +processing and UTF-8 byte decoding while it is active, then restores the exact +prior output code page. `ConfigureOutput = false` and explicitly supplied output +services remain caller-owned configuration boundaries. + Applications that bind Ctrl+C or Ctrl+Z as commands should request `TerminalInputMode.Raw`. Raw mode disables POSIX signal handling and Windows processed input so both arrive through `ReadEventAsync()` as Character keys with -the Control modifier. `CBreak` deliberately retains host signal/processed-input -handling for applications that want conventional interrupt and suspend behavior. +the Control modifier. On Windows, Raw and CBreak also enable mouse input and +suppress Quick Edit while the session is active. `CBreak` deliberately retains +host signal/processed-input handling for applications that want conventional +interrupt and suspend behavior. Disposal restores the exact captured mode. `Icod.Terminal` is a managed library but intentionally uses native platform facilities where terminal modes or console behavior require them. Protocol and feature availability still depends on the terminal endpoint attached to the process; operating-system identity or terminal brand is not treated as sufficient support proof. @@ -443,7 +450,7 @@ Recommended documentation entry points: - [`docs/releases/1.24.0.md`](docs/releases/1.24.0.md) — raster geometry, planning, focused evidence, and tile-atlas qualification notes; - [`docs/Raster-Tile-Atlas-Measurement-1.24.md`](docs/Raster-Tile-Atlas-Measurement-1.24.md) — package-only 1/4/16/64-region witness and measurement limits; - [`docs/Screen-Output.md`](docs/Screen-Output.md) — planning, commitment, cancellation, and caller-owned recovery; -- [`Icod.Terminal-1.21.0-Development-Roadmap.md`](Icod.Terminal-1.21.0-Development-Roadmap.md) — 1.21 input and visibility implementation plan; +- [`docs/Icod.Terminal-1.21.0-Development-Roadmap.md`](docs/Icod.Terminal-1.21.0-Development-Roadmap.md) — 1.21 input and visibility implementation plan; - [`samples/Icod.Terminal.ScreenOutput.Sample/README.md`](samples/Icod.Terminal.ScreenOutput.Sample/README.md) — interactive screen and recovery walkthrough; - [`samples/Icod.Terminal.RichInput.Sample/README.md`](samples/Icod.Terminal.RichInput.Sample/README.md) — modern keyboard phases, fallback, and editor-state walkthrough; - [`CHANGELOG.md`](CHANGELOG.md) — release-by-release feature history; @@ -462,7 +469,7 @@ Recommended documentation entry points: - [`docs/Public-API-Baseline-1.23.md`](docs/Public-API-Baseline-1.23.md) — additive partial-frame and rich-input completion API fingerprint; - [`docs/Public-API-Baseline-1.24.md`](docs/Public-API-Baseline-1.24.md) — historical geometry, planning, and focused-evidence fingerprint; - [`docs/Public-API-Baseline-1.27.md`](docs/Public-API-Baseline-1.27.md) — current frozen API and additive environment-awareness fingerprint; -- [`Icod.Terminal-Development-Roadmap.md`](Icod.Terminal-Development-Roadmap.md) — current and longer-range development direction. +- [`docs/Icod.Terminal-Development-Roadmap.md`](docs/Icod.Terminal-Development-Roadmap.md) — current and longer-range development direction. Release notes, public-API baselines, tranche records, implementation plans, and historical roadmaps remain in the repository as engineering evidence. They are intentionally not repeated in this README. diff --git a/docs/A189-1.8.0-Package-Documentation-Compatibility-and-Release-Closure.md b/docs/A189-1.8.0-Package-Documentation-Compatibility-and-Release-Closure.md index 1e4b80ead..ce1adc245 100644 --- a/docs/A189-1.8.0-Package-Documentation-Compatibility-and-Release-Closure.md +++ b/docs/A189-1.8.0-Package-Documentation-Compatibility-and-Release-Closure.md @@ -119,8 +119,8 @@ A189 synchronizes the primary release authorities: - `docs/Compatibility-and-Versioning.md`; - `docs/Semantic-Output-Protocols.md`; - `docs/Control-Language-Normalization-and-Graphics-Roadmap.md`; -- `Icod.Terminal-1.8.0-Development-Roadmap.md`; -- `Icod.Terminal-Development-Roadmap.md`; +- `docs/Icod.Terminal-1.8.0-Development-Roadmap.md`; +- `docs/Icod.Terminal-Development-Roadmap.md`; - NuGet package release notes; - PR #46 tranche/acceptance ledger. diff --git a/docs/C165-1.6.0-Acceptance-Package-and-Documentation-Closure.md b/docs/C165-1.6.0-Acceptance-Package-and-Documentation-Closure.md index d7debaa48..1d1c7ac73 100644 --- a/docs/C165-1.6.0-Acceptance-Package-and-Documentation-Closure.md +++ b/docs/C165-1.6.0-Acceptance-Package-and-Documentation-Closure.md @@ -118,8 +118,8 @@ The 1.6 release retains: C165 synchronizes or reviews: -- `Icod.Terminal-1.6.0-Development-Roadmap.md`; -- `Icod.Terminal-Development-Roadmap.md`; +- `docs/Icod.Terminal-1.6.0-Development-Roadmap.md`; +- `docs/Icod.Terminal-Development-Roadmap.md`; - `README.md`; - `CHANGELOG.md`; - `docs/releases/1.6.0.md`; diff --git a/docs/Clipboard-Transfer-Design-1.29.md b/docs/Clipboard-Transfer-Design-1.29.md index 6d300c544..13d562dd5 100644 --- a/docs/Clipboard-Transfer-Design-1.29.md +++ b/docs/Clipboard-Transfer-Design-1.29.md @@ -231,4 +231,4 @@ query or overwrite the user's clipboard during sample startup or session open. - [XTerm control sequences, OSC 52](https://invisible-island.net/xterm/ctlseqs/ctlseqs.html) - [Architecture](Architecture.md) - [Security and privacy](Security-and-Privacy.md) -- [Development roadmap](../Icod.Terminal-1.29.0-Development-Roadmap.md) +- [Development roadmap](Icod.Terminal-1.29.0-Development-Roadmap.md) diff --git a/docs/D179-1.7.0-Hardening-Package-and-Documentation-Closure.md b/docs/D179-1.7.0-Hardening-Package-and-Documentation-Closure.md index 73967d766..e43c291de 100644 --- a/docs/D179-1.7.0-Hardening-Package-and-Documentation-Closure.md +++ b/docs/D179-1.7.0-Hardening-Package-and-Documentation-Closure.md @@ -120,8 +120,8 @@ The release-facing documentation has been synchronized to describe the completed - `docs/Security-and-Privacy.md`; - `docs/Compatibility-and-Versioning.md`; - `docs/releases/1.7.0.md`; -- `Icod.Terminal-1.7.0-Development-Roadmap.md`; -- `Icod.Terminal-Development-Roadmap.md`; +- `docs/Icod.Terminal-1.7.0-Development-Roadmap.md`; +- `docs/Icod.Terminal-Development-Roadmap.md`; - `packaging/README.md`; - pull-request summary/checkpoint ledger. diff --git a/docs/E190-Unsolicited-Semantic-Event-Contract-and-Reference-Freeze.md b/docs/E190-Unsolicited-Semantic-Event-Contract-and-Reference-Freeze.md index 7efd4de24..5f8246aab 100644 --- a/docs/E190-Unsolicited-Semantic-Event-Contract-and-Reference-Freeze.md +++ b/docs/E190-Unsolicited-Semantic-Event-Contract-and-Reference-Freeze.md @@ -257,8 +257,8 @@ E190 rejects the following from the 1.9 scope: E199 must reconcile at least: -- `Icod.Terminal-Development-Roadmap.md`; -- `Icod.Terminal-1.9.0-Development-Roadmap.md`; +- `docs/Icod.Terminal-Development-Roadmap.md`; +- `docs/Icod.Terminal-1.9.0-Development-Roadmap.md`; - `docs/Architecture.md`; - `docs/Input-and-Events.md`; - `docs/Queries-and-Responses.md`; diff --git a/docs/E199-1.9.0-Public-API-Documentation-Compatibility-and-Release-Closure.md b/docs/E199-1.9.0-Public-API-Documentation-Compatibility-and-Release-Closure.md index 567f9f1fd..5f3ab5d77 100644 --- a/docs/E199-1.9.0-Public-API-Documentation-Compatibility-and-Release-Closure.md +++ b/docs/E199-1.9.0-Public-API-Documentation-Compatibility-and-Release-Closure.md @@ -101,8 +101,8 @@ E199 aligns: - `README.md`; - `CHANGELOG.md`; -- `Icod.Terminal-Development-Roadmap.md`; -- `Icod.Terminal-1.9.0-Development-Roadmap.md`; +- `docs/Icod.Terminal-Development-Roadmap.md`; +- `docs/Icod.Terminal-1.9.0-Development-Roadmap.md`; - `docs/releases/1.9.0.md`; - `docs/Public-API-Baseline-1.9.md`; - `docs/Architecture.md`; diff --git a/docs/Graphics-Development-Hold.md b/docs/Graphics-Development-Hold.md index 5bd92b6f6..84dc2d742 100644 --- a/docs/Graphics-Development-Hold.md +++ b/docs/Graphics-Development-Hold.md @@ -106,7 +106,7 @@ is: - qualify each persistent ATLAS claim only through recorded downstream live evidence at the claimed scope; - retain controlled FRAME/TEXT fallback for unqualified implementations. -The [1.28 development roadmap](../Icod.Terminal-1.28.0-Development-Roadmap.md) +The [1.28 development roadmap](Icod.Terminal-1.28.0-Development-Roadmap.md) defines T2800–T2810. T2800 must pin the action-by-action response matrix, freeze any additive public confirmation model and produce a reviewed implementation plan before runtime code changes. diff --git a/Icod.Terminal-0.10.0-Development-Roadmap.md b/docs/Icod.Terminal-0.10.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.10.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.10.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.11.0-Development-Roadmap.md b/docs/Icod.Terminal-0.11.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.11.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.11.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.12.0-Development-Roadmap.md b/docs/Icod.Terminal-0.12.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.12.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.12.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.13.0-Development-Roadmap.md b/docs/Icod.Terminal-0.13.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.13.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.13.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.14.0-Development-Roadmap.md b/docs/Icod.Terminal-0.14.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.14.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.14.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.15.0-Development-Roadmap.md b/docs/Icod.Terminal-0.15.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.15.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.15.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.16.0-Development-Roadmap.md b/docs/Icod.Terminal-0.16.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.16.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.16.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.17.0-Development-Roadmap.md b/docs/Icod.Terminal-0.17.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.17.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.17.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.18.0-Development-Roadmap.md b/docs/Icod.Terminal-0.18.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.18.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.18.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.2.0-Development-Roadmap.md b/docs/Icod.Terminal-0.2.0-Development-Roadmap.md similarity index 96% rename from Icod.Terminal-0.2.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.2.0-Development-Roadmap.md index 3835b9f18..b1f877185 100644 --- a/Icod.Terminal-0.2.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-0.2.0-Development-Roadmap.md @@ -12,7 +12,7 @@ **Stable contract target:** `1.0.0` **Final release version:** `0.2.0` **Status:** Released publicly as `v0.2.0`; T13-T20 complete -**Successor roadmap:** [`Icod.Terminal-0.3.0-Development-Roadmap.md`](Icod.Terminal-0.3.0-Development-Roadmap.md) +**Successor roadmap:** [`docs/Icod.Terminal-0.3.0-Development-Roadmap.md`](Icod.Terminal-0.3.0-Development-Roadmap.md) --- @@ -265,7 +265,7 @@ Required work: `0.2.0-alpha.1`, with no runtime behavior change and no remaining `0.1.0`-specific release assumptions in the validation tooling. -**T13 implementation record:** [`docs/T13-0.2-Foundation-and-Contract-Reset.md`](docs/T13-0.2-Foundation-and-Contract-Reset.md). +**T13 implementation record:** [`docs/T13-0.2-Foundation-and-Contract-Reset.md`](T13-0.2-Foundation-and-Contract-Reset.md). --- @@ -308,7 +308,7 @@ configuration. does not require any protocol-specific reader outside the existing session input path. -**T14 completion record:** [`docs/T14-Rich-Input-Event-Model-and-Decoder-Policy.md`](docs/T14-Rich-Input-Event-Model-and-Decoder-Policy.md). +**T14 completion record:** [`docs/T14-Rich-Input-Event-Model-and-Decoder-Policy.md`](T14-Rich-Input-Event-Model-and-Decoder-Policy.md). --- @@ -353,7 +353,7 @@ than emitted for every terminal. partial-failure rollback, suspend/resume re-entry, and final restoration for all rich input protocols. -**T15 implementation record:** [`docs/T15-Reversible-Input-Protocol-Leases.md`](docs/T15-Reversible-Input-Protocol-Leases.md). +**T15 implementation record:** [`docs/T15-Reversible-Input-Protocol-Leases.md`](T15-Reversible-Input-Protocol-Leases.md). --- @@ -396,7 +396,7 @@ keystrokes. Paste is semantically distinct input. sequences, multi-chunk payloads, Unicode boundaries, cancellation, timeout, end-of-input, and bounded-memory behavior. -**T16 implementation record:** [`docs/T16-Focus-and-Bracketed-Paste.md`](docs/T16-Focus-and-Bracketed-Paste.md). +**T16 implementation record:** [`docs/T16-Focus-and-Bracketed-Paste.md`](T16-Focus-and-Bracketed-Paste.md). --- @@ -453,7 +453,7 @@ Tests SHALL cover: paste, and lifecycle events in deterministic order without private consumer parsers. -**T17 implementation record:** [`docs/T17-Mouse-Input.md`](docs/T17-Mouse-Input.md). +**T17 implementation record:** [`docs/T17-Mouse-Input.md`](T17-Mouse-Input.md). --- @@ -483,7 +483,7 @@ keyboard event. Unknown protocol data must remain bounded and deterministic. **Gate T18:** modified traditional keys decode consistently across fragmented input and profile fixtures without regressing the 0.1 key contract. -**T18 implementation record:** [`docs/T18-Traditional-Keyboard-Completeness.md`](docs/T18-Traditional-Keyboard-Completeness.md). +**T18 implementation record:** [`docs/T18-Traditional-Keyboard-Completeness.md`](T18-Traditional-Keyboard-Completeness.md). --- @@ -518,7 +518,7 @@ consumer for each new event family. `Icod.Terminal`, and disabling/removing Terminal support would leave no hidden parallel terminal protocol implementation in DCurses. -**T19 acceptance record:** [`docs/T19-DCurses-Rich-Input-Acceptance.md`](docs/T19-DCurses-Rich-Input-Acceptance.md). +**T19 acceptance record:** [`docs/T19-DCurses-Rich-Input-Acceptance.md`](T19-DCurses-Rich-Input-Acceptance.md). --- @@ -530,7 +530,7 @@ T20 closes the release in the same disciplined manner as 0.1. 0.2 API baseline, complete rich-input README documentation, and extend the three-framework package-only consumer through focus, paste, mouse, traditional modified keys, and reversible input-protocol leases. The checkpoint is recorded -in [`docs/T20A-0.2-Release-Candidate-Gate.md`](docs/T20A-0.2-Release-Candidate-Gate.md). +in [`docs/T20A-0.2-Release-Candidate-Gate.md`](T20A-0.2-Release-Candidate-Gate.md). Alpha-8 passed the complete Windows/Ubuntu/macOS PR package gate in GitHub Actions run `33132667483`. @@ -538,7 +538,7 @@ Actions run `33132667483`. **T20B — complete.** The accepted release candidate was promoted to stable `0.2.0`, merged to `main`, validated again, and published by the matching `v0.2.0` tag-controlled release workflow. The closure record is -[`docs/T20B-0.2.0-Release-Closure.md`](docs/T20B-0.2.0-Release-Closure.md). +[`docs/T20B-0.2.0-Release-Closure.md`](T20B-0.2.0-Release-Closure.md). Required work: diff --git a/Icod.Terminal-0.3.0-Development-Roadmap.md b/docs/Icod.Terminal-0.3.0-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-0.3.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.3.0-Development-Roadmap.md index 4b994f2d0..e8e350176 100644 --- a/Icod.Terminal-0.3.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-0.3.0-Development-Roadmap.md @@ -389,7 +389,7 @@ refactor the input path without inventing cancellation, correlation, timeout, or probe policy during implementation. **T21 completion record:** -[`docs/T21-0.3-Foundation-and-Contract-Reset.md`](docs/T21-0.3-Foundation-and-Contract-Reset.md). +[`docs/T21-0.3-Foundation-and-Contract-Reset.md`](T21-0.3-Foundation-and-Contract-Reset.md). --- @@ -428,7 +428,7 @@ Unclaimed input remains on the established application event path, and the session lifecycle path remains unchanged. **T22 completion record:** -[`docs/T22-Response-Framing-and-Single-Reader-Demultiplexing.md`](docs/T22-Response-Framing-and-Single-Reader-Demultiplexing.md). +[`docs/T22-Response-Framing-and-Single-Reader-Demultiplexing.md`](T22-Response-Framing-and-Single-Reader-Demultiplexing.md). --- @@ -472,7 +472,7 @@ response to be returned as ordinary application input or attributed to a later ambiguity-sensitive query while the bounded ownership contract remains active. **T23 completion record:** -[`docs/T23-Query-Transactions-Deadlines-and-Late-Response-Ownership.md`](docs/T23-Query-Transactions-Deadlines-and-Late-Response-Ownership.md). +[`docs/T23-Query-Transactions-Deadlines-and-Late-Response-Ownership.md`](T23-Query-Transactions-Deadlines-and-Late-Response-Ownership.md). --- @@ -513,7 +513,7 @@ consumer justifies a stable typed contract. **Gate T24: complete.** Common CSI queries work through normal async/await while preserving the 0.2 input stream and the T23 cancellation/late-response contract. -**T24 completion record:** [`docs/T24-CSI-Query-Family.md`](docs/T24-CSI-Query-Family.md). +**T24 completion record:** [`docs/T24-CSI-Query-Family.md`](T24-CSI-Query-Family.md). --- @@ -552,7 +552,7 @@ terminal control data through a nominal DECRQSS operation. router is not CSI-specific and that DCS framing remains bounded under malformed or hostile input. -**T25 completion record:** [`docs/T25-DECRQSS.md`](docs/T25-DECRQSS.md). +**T25 completion record:** [`docs/T25-DECRQSS.md`](T25-DECRQSS.md). --- @@ -599,7 +599,7 @@ additional public complexity. observations without mutating or replacing the session's `Icod.TermInfo` description. -**T26 completion record:** [`docs/T26-XTGETTCAP.md`](docs/T26-XTGETTCAP.md). +**T26 completion record:** [`docs/T26-XTGETTCAP.md`](T26-XTGETTCAP.md). --- @@ -640,7 +640,7 @@ Acceptance evidence completed before T28B: consumer both preserve the one-reader and ownership boundaries. **T27 acceptance record:** -[`docs/T27-Query-Integration-and-Probe-Acceptance.md`](docs/T27-Query-Integration-and-Probe-Acceptance.md). +[`docs/T27-Query-Integration-and-Probe-Acceptance.md`](T27-Query-Integration-and-Probe-Acceptance.md). --- @@ -659,7 +659,7 @@ Completed work: - reviews every public type and member added by 0.3 and finds no breaking correction required before stable release; -- publishes [`docs/Public-API-Baseline-0.3.md`](docs/Public-API-Baseline-0.3.md); +- publishes [`docs/Public-API-Baseline-0.3.md`](Public-API-Baseline-0.3.md); - documents caller cancellation, caller-visible timeout, bounded late-response ownership, the one-reader invariant, explicit probing, supported query families, and resource bounds; @@ -688,7 +688,7 @@ Acceptance evidence: release closure may proceed. **T28A completion record:** -[`docs/T28A-0.3-Release-Candidate-Gate.md`](docs/T28A-0.3-Release-Candidate-Gate.md). +[`docs/T28A-0.3-Release-Candidate-Gate.md`](T28A-0.3-Release-Candidate-Gate.md). ## 14.2 T28B — Stable Release Closure @@ -722,7 +722,7 @@ while bounded ownership remains active, CSI and DCS query families are supported, and the package passes the complete three-host package-only gate. **T28B completion record:** -[`docs/T28B-0.3.0-Release-Closure.md`](docs/T28B-0.3.0-Release-Closure.md). +[`docs/T28B-0.3.0-Release-Closure.md`](T28B-0.3.0-Release-Closure.md). --- diff --git a/Icod.Terminal-0.4.0-Development-Roadmap.md b/docs/Icod.Terminal-0.4.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.4.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.4.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.4.0-to-0.9.0-Protocol-Closure-Roadmap.md b/docs/Icod.Terminal-0.4.0-to-0.9.0-Protocol-Closure-Roadmap.md similarity index 100% rename from Icod.Terminal-0.4.0-to-0.9.0-Protocol-Closure-Roadmap.md rename to docs/Icod.Terminal-0.4.0-to-0.9.0-Protocol-Closure-Roadmap.md diff --git a/Icod.Terminal-0.5.0-Development-Roadmap.md b/docs/Icod.Terminal-0.5.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.5.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.5.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.6.0-Development-Roadmap.md b/docs/Icod.Terminal-0.6.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.6.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.6.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.7.0-Development-Roadmap.md b/docs/Icod.Terminal-0.7.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.7.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.7.0-Development-Roadmap.md diff --git a/Icod.Terminal-0.8.0-Development-Roadmap.md b/docs/Icod.Terminal-0.8.0-Development-Roadmap.md similarity index 91% rename from Icod.Terminal-0.8.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.8.0-Development-Roadmap.md index ae254b720..3753e27fa 100644 --- a/Icod.Terminal-0.8.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-0.8.0-Development-Roadmap.md @@ -46,7 +46,7 @@ Bar styles are retained as xterm-compatible extensions without fabricating proof ## 3. Stable public API -The reviewed 0.8 public delta is frozen in [`docs/Public-API-Baseline-0.8.md`](docs/Public-API-Baseline-0.8.md): +The reviewed 0.8 public delta is frozen in [`docs/Public-API-Baseline-0.8.md`](Public-API-Baseline-0.8.md): ```text TerminalCursorStyle @@ -69,13 +69,13 @@ The 0.8 release uses tranche numbers `T80` through `T87`, aligned with the relea Frozen numeric mapping, DEC/xterm boundary, query semantics, parameter-zero policy, restoration truthfulness, and cursor-style/visibility independence. -Record: [`docs/T80-Cursor-Style-Contract-and-Reference-Freeze.md`](docs/T80-Cursor-Style-Contract-and-Reference-Freeze.md) +Record: [`docs/T80-Cursor-Style-Contract-and-Reference-Freeze.md`](T80-Cursor-Style-Contract-and-Reference-Freeze.md) ### T81 — reusable CSI intermediate-byte output primitive — complete Implemented structural CSI parameter/intermediate/final-byte output, canonical seven-bit framing, and byte-exact DECSCUSR emission for parameters `1`–`6` without a public raw CSI escape hatch. -Record: [`docs/T81-CSI-Intermediate-Byte-Output-Primitive.md`](docs/T81-CSI-Intermediate-Byte-Output-Primitive.md) +Record: [`docs/T81-CSI-Intermediate-Byte-Output-Primitive.md`](T81-CSI-Intermediate-Byte-Output-Primitive.md) Validation: workflow #246 green. @@ -83,7 +83,7 @@ Validation: workflow #246 green. Implemented the six-value `TerminalCursorStyle` model, deterministic outbound mapping, strict inbound status parsing, omitted/`0`/`1` normalization, and rejection of malformed/unknown positive state. -Record: [`docs/T82-Typed-Cursor-Style-Codec-and-DECRQSS-Interpretation.md`](docs/T82-Typed-Cursor-Style-Codec-and-DECRQSS-Interpretation.md) +Record: [`docs/T82-Typed-Cursor-Style-Codec-and-DECRQSS-Interpretation.md`](T82-Typed-Cursor-Style-Codec-and-DECRQSS-Interpretation.md) Validation: workflow #250 green. @@ -91,7 +91,7 @@ Validation: workflow #250 green. Implemented public `SetCursorStyleAsync(...)` with semantic validation, redirected-output rejection, shared output serialization, cancellation-before-commit, non-truncating committed frames, and no implicit flush. -Record: [`docs/T83-Semantic-Cursor-Style-Set-API.md`](docs/T83-Semantic-Cursor-Style-Set-API.md) +Record: [`docs/T83-Semantic-Cursor-Style-Set-API.md`](T83-Semantic-Cursor-Style-Set-API.md) Validation: workflow #260 green with T84. @@ -99,7 +99,7 @@ Validation: workflow #260 green with T84. Implemented `TerminalCursorStyleObservation` and `QueryCursorStyleAsync(...)` on the existing DECRQSS `SP q` transaction path. Unsupported, timeout, cancellation, and malformed positive state remain distinct outcomes. -Record: [`docs/T84-Typed-Cursor-Style-Query-and-Observation.md`](docs/T84-Typed-Cursor-Style-Query-and-Observation.md) +Record: [`docs/T84-Typed-Cursor-Style-Query-and-Observation.md`](T84-Typed-Cursor-Style-Query-and-Observation.md) Validation: workflow #260 green with T83. @@ -107,7 +107,7 @@ Validation: workflow #260 green with T83. Accepted `TerminalCursorStyleLease` and `AcquireCursorStyleAsync(...)` because the outermost acquisition first observes an authoritative semantic baseline. Nested leases are strict LIFO. Suspend restores the observed baseline; resume reapplies the active innermost logical style; disposal performs final best-effort restoration. No guessed reset participates. -Record: [`docs/T85-Cursor-Style-Restoration-and-Scoped-State.md`](docs/T85-Cursor-Style-Restoration-and-Scoped-State.md) +Record: [`docs/T85-Cursor-Style-Restoration-and-Scoped-State.md`](T85-Cursor-Style-Restoration-and-Scoped-State.md) Validation: workflow #270 green. @@ -115,7 +115,7 @@ Validation: workflow #270 green. Added acceptance coverage for cursor-style/visibility independence, deterministic ordering with text and OSC 0/1/2/7/8/52, lifecycle baseline restoration/re-entry, and release-while-suspended behavior. Existing T82/T84 query tests remain authoritative for malformed responses, cancellation, timeout, late-response ownership, and single-reader behavior. -Record: [`docs/T86-Cursor-Style-Integration-Compatibility-and-Regression-Acceptance.md`](docs/T86-Cursor-Style-Integration-Compatibility-and-Regression-Acceptance.md) +Record: [`docs/T86-Cursor-Style-Integration-Compatibility-and-Regression-Acceptance.md`](T86-Cursor-Style-Integration-Compatibility-and-Regression-Acceptance.md) Validation: workflow #275 green. @@ -134,7 +134,7 @@ Implemented: - PR, `main` distribution, and tagged-release integration of the 0.8 package gate; - stable closure record and release-order gate. -Record: [`docs/T87-0.8.0-Public-API-Package-and-Stable-Closure.md`](docs/T87-0.8.0-Public-API-Package-and-Stable-Closure.md) +Record: [`docs/T87-0.8.0-Public-API-Package-and-Stable-Closure.md`](T87-0.8.0-Public-API-Package-and-Stable-Closure.md) **T87 gate:** exact stable PR head must be green before merge. After merge, `main` Release distribution validation must be green before tag `v0.8.0` is created. diff --git a/Icod.Terminal-0.9.0-Development-Roadmap.md b/docs/Icod.Terminal-0.9.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-0.9.0-Development-Roadmap.md rename to docs/Icod.Terminal-0.9.0-Development-Roadmap.md diff --git a/Icod.Terminal-1.0.0-rc1-Development-Roadmap.md b/docs/Icod.Terminal-1.0.0-rc1-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-1.0.0-rc1-Development-Roadmap.md rename to docs/Icod.Terminal-1.0.0-rc1-Development-Roadmap.md diff --git a/Icod.Terminal-1.10.0-Development-Roadmap.md b/docs/Icod.Terminal-1.10.0-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-1.10.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.10.0-Development-Roadmap.md index 8f3c21135..02b4e815c 100644 --- a/Icod.Terminal-1.10.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.10.0-Development-Roadmap.md @@ -64,7 +64,7 @@ C100 changes no public runtime API. C101 froze a deliberately reduced, dependency-neutral public planning vocabulary in: -[`docs/C101-Semantic-Capability-Vocabulary-and-API-Regret-Gate.md`](docs/C101-Semantic-Capability-Vocabulary-and-API-Regret-Gate.md) +[`docs/C101-Semantic-Capability-Vocabulary-and-API-Regret-Gate.md`](C101-Semantic-Capability-Vocabulary-and-API-Regret-Gate.md) The initial public capability set is: @@ -129,7 +129,7 @@ ee705250d19d51df92645e5020f188646dd2dbf38483278e6e57ce6fbbc1e9fb The final 1.10 baseline is maintained in: -- [`docs/Public-API-Baseline-1.10.md`](docs/Public-API-Baseline-1.10.md) +- [`docs/Public-API-Baseline-1.10.md`](Public-API-Baseline-1.10.md) - `docs/Public-API-Baseline-1.10.sha256` ## Public capability-planning direction @@ -194,7 +194,7 @@ C109 1.10.0 release closure complete C105–C108 are accepted as recorded in: -[`docs/C105-C108-Capability-Lifecycle-Samples-Hardening-and-API-Freeze.md`](docs/C105-C108-Capability-Lifecycle-Samples-Hardening-and-API-Freeze.md) +[`docs/C105-C108-Capability-Lifecycle-Samples-Hardening-and-API-Freeze.md`](C105-C108-Capability-Lifecycle-Samples-Hardening-and-API-Freeze.md) The accepted feature head was: diff --git a/Icod.Terminal-1.11.0-Development-Roadmap.md b/docs/Icod.Terminal-1.11.0-Development-Roadmap.md similarity index 96% rename from Icod.Terminal-1.11.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.11.0-Development-Roadmap.md index d9fb8f12b..112995805 100644 --- a/Icod.Terminal-1.11.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.11.0-Development-Roadmap.md @@ -17,11 +17,11 @@ The release deliberately does **not** turn `Icod.Terminal` into a virtual-screen The approved architectural specification is: -[`docs/superpowers/specs/2026-09-11-1.11.0-persistent-raster-design.md`](docs/superpowers/specs/2026-09-11-1.11.0-persistent-raster-design.md) +[`docs/superpowers/specs/2026-09-11-1.11.0-persistent-raster-design.md`](superpowers/specs/2026-09-11-1.11.0-persistent-raster-design.md) The implementation plan is: -[`docs/superpowers/plans/2026-09-11-1.11.0-persistent-raster.md`](docs/superpowers/plans/2026-09-11-1.11.0-persistent-raster.md) +[`docs/superpowers/plans/2026-09-11-1.11.0-persistent-raster.md`](superpowers/plans/2026-09-11-1.11.0-persistent-raster.md) ## Architectural objectives @@ -92,7 +92,7 @@ C111–C117 implemented the frozen persistent-raster protocol, capability, owner The C118 acceptance record is: -[`docs/C118-1.11.0-Persistent-Raster-Adversarial-Downstream-and-Package-Qualification.md`](docs/C118-1.11.0-Persistent-Raster-Adversarial-Downstream-and-Package-Qualification.md) +[`docs/C118-1.11.0-Persistent-Raster-Adversarial-Downstream-and-Package-Qualification.md`](C118-1.11.0-Persistent-Raster-Adversarial-Downstream-and-Package-Qualification.md) Validated feature head: @@ -114,7 +114,7 @@ That unchanged feature head passed Windows, Linux, macOS, package/API candidate, The record is: -[`docs/C110-Persistent-Raster-Architecture-and-API-Regret-Gate.md`](docs/C110-Persistent-Raster-Architecture-and-API-Regret-Gate.md) +[`docs/C110-Persistent-Raster-Architecture-and-API-Regret-Gate.md`](C110-Persistent-Raster-Architecture-and-API-Regret-Gate.md) ## C111 — persistent Kitty protocol foundation @@ -171,7 +171,7 @@ The release-facing state includes: - 1.11 Architecture/Security/Compatibility authority updates; - final sample catalog and backend-neutral sample verification; - long-range roadmap handoff to conditional 1.12 advanced placement/lifecycle work; -- release-closure record at [`docs/C119-1.11.0-Release-Closure.md`](docs/C119-1.11.0-Release-Closure.md). +- release-closure record at [`docs/C119-1.11.0-Release-Closure.md`](C119-1.11.0-Release-Closure.md). C119 code/release acceptance is frozen on exact head: diff --git a/Icod.Terminal-1.11.1-Development-Roadmap.md b/docs/Icod.Terminal-1.11.1-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-1.11.1-Development-Roadmap.md rename to docs/Icod.Terminal-1.11.1-Development-Roadmap.md index 48335b7a0..cf7e3f3df 100644 --- a/Icod.Terminal-1.11.1-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.11.1-Development-Roadmap.md @@ -41,11 +41,11 @@ Version `1.11.1` exists to prove that boundary end-to-end through an executable The implementation plan is: -[`docs/superpowers/plans/2026-09-12-1.11.1-terminfo-persistent-raster-integration.md`](docs/superpowers/plans/2026-09-12-1.11.1-terminfo-persistent-raster-integration.md) +[`docs/superpowers/plans/2026-09-12-1.11.1-terminfo-persistent-raster-integration.md`](superpowers/plans/2026-09-12-1.11.1-terminfo-persistent-raster-integration.md) The runtime ownership authority remains: -[`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md) +[`docs/Persistent-Raster-Ownership.md`](Persistent-Raster-Ownership.md) The TermInfo semantic authority is: @@ -55,7 +55,7 @@ https://github.com/uniblab/Icod.TermInfo/blob/main/docs/1.11.0-PERSISTENT-RASTER The release-closure record is: -[`docs/T1111-E-1.11.1-Release-Closure.md`](docs/T1111-E-1.11.1-Release-Closure.md) +[`docs/T1111-E-1.11.1-Release-Closure.md`](T1111-E-1.11.1-Release-Closure.md) ## Release objectives diff --git a/Icod.Terminal-1.12.0-Development-Roadmap.md b/docs/Icod.Terminal-1.12.0-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-1.12.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.12.0-Development-Roadmap.md index 9da6751b4..29e6157ab 100644 --- a/Icod.Terminal-1.12.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.12.0-Development-Roadmap.md @@ -19,15 +19,15 @@ Before the new public surface landed, T121 completed the approved table-driven c Design authority: -[`docs/superpowers/specs/2026-09-12-1.12.0-advanced-raster-placement-design.md`](docs/superpowers/specs/2026-09-12-1.12.0-advanced-raster-placement-design.md) +[`docs/superpowers/specs/2026-09-12-1.12.0-advanced-raster-placement-design.md`](superpowers/specs/2026-09-12-1.12.0-advanced-raster-placement-design.md) Implementation plan: -[`docs/superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md`](docs/superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md) +[`docs/superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md`](superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md) Permanent persistent-ownership authority: -[`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md) +[`docs/Persistent-Raster-Ownership.md`](Persistent-Raster-Ownership.md) ## Frozen public surface diff --git a/Icod.Terminal-1.13.0-Development-Roadmap.md b/docs/Icod.Terminal-1.13.0-Development-Roadmap.md similarity index 96% rename from Icod.Terminal-1.13.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.13.0-Development-Roadmap.md index 2a2ce97ab..7201124c8 100644 --- a/Icod.Terminal-1.13.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.13.0-Development-Roadmap.md @@ -16,19 +16,19 @@ The release is about ownership and lifecycle, not a scene graph. It does not mov Design authority: -[`docs/superpowers/specs/2026-09-12-1.13.0-relative-persistent-raster-placement-design.md`](docs/superpowers/specs/2026-09-12-1.13.0-relative-persistent-raster-placement-design.md) +[`docs/superpowers/specs/2026-09-12-1.13.0-relative-persistent-raster-placement-design.md`](superpowers/specs/2026-09-12-1.13.0-relative-persistent-raster-placement-design.md) Implementation plan: -[`docs/superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md`](docs/superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md) +[`docs/superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md`](superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md) Permanent ownership authority: -[`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md) +[`docs/Persistent-Raster-Ownership.md`](Persistent-Raster-Ownership.md) Release notes: -[`docs/releases/1.13.0.md`](docs/releases/1.13.0.md) +[`docs/releases/1.13.0.md`](releases/1.13.0.md) ## Frozen architecture decisions @@ -131,7 +131,7 @@ Final public API fingerprint: c9dc8b86dc1e8beed7161f1f5a122dce67a9187d3f4ee0b85ad5b49f09bd0da9 ``` -See [`docs/Public-API-Baseline-1.13.md`](docs/Public-API-Baseline-1.13.md). +See [`docs/Public-API-Baseline-1.13.md`](Public-API-Baseline-1.13.md). ## Tranche record diff --git a/Icod.Terminal-1.14.0-Development-Roadmap.md b/docs/Icod.Terminal-1.14.0-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-1.14.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.14.0-Development-Roadmap.md index 1dd113818..ec3ab3536 100644 --- a/Icod.Terminal-1.14.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.14.0-Development-Roadmap.md @@ -18,15 +18,15 @@ The governing rule is: Design authority: -[`docs/superpowers/specs/2026-09-13-1.14.0-persistent-raster-lifecycle-observability-design.md`](docs/superpowers/specs/2026-09-13-1.14.0-persistent-raster-lifecycle-observability-design.md) +[`docs/superpowers/specs/2026-09-13-1.14.0-persistent-raster-lifecycle-observability-design.md`](superpowers/specs/2026-09-13-1.14.0-persistent-raster-lifecycle-observability-design.md) Implementation plan: -[`docs/superpowers/plans/2026-09-13-1.14.0-persistent-raster-lifecycle-observability.md`](docs/superpowers/plans/2026-09-13-1.14.0-persistent-raster-lifecycle-observability.md) +[`docs/superpowers/plans/2026-09-13-1.14.0-persistent-raster-lifecycle-observability.md`](superpowers/plans/2026-09-13-1.14.0-persistent-raster-lifecycle-observability.md) Permanent ownership authority: -[`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md) +[`docs/Persistent-Raster-Ownership.md`](Persistent-Raster-Ownership.md) ## Why this release follows 1.13 diff --git a/Icod.Terminal-1.15.0-Development-Roadmap.md b/docs/Icod.Terminal-1.15.0-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-1.15.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.15.0-Development-Roadmap.md index a5012fcf3..72121340e 100644 --- a/Icod.Terminal-1.15.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.15.0-Development-Roadmap.md @@ -18,19 +18,19 @@ The governing rule is: Design authority: -[`docs/superpowers/specs/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement-design.md`](docs/superpowers/specs/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement-design.md) +[`docs/superpowers/specs/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement-design.md`](superpowers/specs/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement-design.md) Implementation plan: -[`docs/superpowers/plans/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement.md`](docs/superpowers/plans/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement.md) +[`docs/superpowers/plans/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement.md`](superpowers/plans/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement.md) Permanent ownership authority: -[`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md) +[`docs/Persistent-Raster-Ownership.md`](Persistent-Raster-Ownership.md) Curated release notes: -[`docs/releases/1.15.0.md`](docs/releases/1.15.0.md) +[`docs/releases/1.15.0.md`](releases/1.15.0.md) ## Persistent-raster progression diff --git a/Icod.Terminal-1.16.0-Development-Roadmap.md b/docs/Icod.Terminal-1.16.0-Development-Roadmap.md similarity index 99% rename from Icod.Terminal-1.16.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.16.0-Development-Roadmap.md index 84874342c..ef4fb7f22 100644 --- a/Icod.Terminal-1.16.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.16.0-Development-Roadmap.md @@ -30,11 +30,11 @@ The governing rule is: Design authority: -[`docs/superpowers/specs/2026-09-15-1.16.0-persistent-raster-animation-frame-lifecycle-design.md`](docs/superpowers/specs/2026-09-15-1.16.0-persistent-raster-animation-frame-lifecycle-design.md) +[`docs/superpowers/specs/2026-09-15-1.16.0-persistent-raster-animation-frame-lifecycle-design.md`](superpowers/specs/2026-09-15-1.16.0-persistent-raster-animation-frame-lifecycle-design.md) Permanent persistent-raster ownership authority: -[`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md) +[`docs/Persistent-Raster-Ownership.md`](Persistent-Raster-Ownership.md) ## Why animation follows 1.15 diff --git a/Icod.Terminal-1.17.0-Development-Roadmap.md b/docs/Icod.Terminal-1.17.0-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-1.17.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.17.0-Development-Roadmap.md index ef9e04a85..684e050fe 100644 --- a/Icod.Terminal-1.17.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.17.0-Development-Roadmap.md @@ -25,8 +25,8 @@ TermInfo remains the immutable capability-data, expansion, and padding authority ## Design authority -- [`docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md`](docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md) -- [`docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md`](docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md) +- [`docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md`](superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md) +- [`docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md`](superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md) ## Scope @@ -131,7 +131,7 @@ The package release shard runs these as two independent consumers across every s ## T179 — Stable closure -Public API/XML snapshots are frozen across all target frameworks, permanent architecture/compatibility/security authorities and stable release metadata are synchronized, and exact candidate head `d02fc710d2fa8d492153c03dc644f21f194eb1dd` is qualified across Windows, Linux, and macOS. The evidence-only bookkeeping commit defined by [`docs/superpowers/plans/2026-09-18-1.17.0-stable-closure.md`](docs/superpowers/plans/2026-09-18-1.17.0-stable-closure.md) remains to be requalified. +Public API/XML snapshots are frozen across all target frameworks, permanent architecture/compatibility/security authorities and stable release metadata are synchronized, and exact candidate head `d02fc710d2fa8d492153c03dc644f21f194eb1dd` is qualified across Windows, Linux, and macOS. The evidence-only bookkeeping commit defined by [`docs/superpowers/plans/2026-09-18-1.17.0-stable-closure.md`](superpowers/plans/2026-09-18-1.17.0-stable-closure.md) remains to be requalified. Publication remains an explicit maintainer action after the stable candidate is accepted. diff --git a/Icod.Terminal-1.18.0-Development-Roadmap.md b/docs/Icod.Terminal-1.18.0-Development-Roadmap.md similarity index 98% rename from Icod.Terminal-1.18.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.18.0-Development-Roadmap.md index ebc448e4e..043face42 100644 --- a/Icod.Terminal-1.18.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.18.0-Development-Roadmap.md @@ -25,8 +25,8 @@ Icod.DCurses -> Icod.Terminal -> Icod.TermInfo ## Design and implementation authorities -- [`docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md`](docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md) -- [`docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md`](docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md) +- [`docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md`](superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md) +- [`docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md`](superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md) - [`Icod.DCurses 2.0 PR #32`](https://github.com/uniblab/Icod.DCurses/pull/32) ## Accepted implementation record diff --git a/Icod.Terminal-1.19.0-Development-Roadmap.md b/docs/Icod.Terminal-1.19.0-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-1.19.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.19.0-Development-Roadmap.md index e41ad0990..cb66e9bda 100644 --- a/Icod.Terminal-1.19.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.19.0-Development-Roadmap.md @@ -109,7 +109,7 @@ The qualification covers the existing three-OS PR matrix. A fresh six-runner x64 T190 baseline: planning head `8d47c06a3a4260c0b0ad8c9ac7c1b5923fccd99c` passed the full PR workflow [36288163471](https://github.com/uniblab/Icod.Terminal/actions/runs/36288163471). Local Linux baseline execution passed 2,383 unit tests and 15 integration tests on each of net8.0, net9.0, and net10.0; a three-framework baseline package was built. Local multi-node MSBuild is restricted by the execution environment, so local commands use single-process builds; CI retains authority for cross-platform and package gates. The unchanged 1.18 API fingerprint is `48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d`. -The [T190 design record](docs/superpowers/specs/2026-09-26-1.19.0-screen-output-hardening-design.md) admits the two cursor routes and defers cursor visibility to preserve presentation-lease ownership. The decoupled consumer version is pinned to DCurses 2.2.0, whose source declares Terminal 1.18.0 as its sole production dependency; DCurses 1.6.0 remains a separate compatibility gate. A separate synthetic test harness supplies the legacy TermInfo-bearing provider setup while the controlled renderer consumer retains its source/reference boundary checks. +The [T190 design record](superpowers/specs/2026-09-26-1.19.0-screen-output-hardening-design.md) admits the two cursor routes and defers cursor visibility to preserve presentation-lease ownership. The decoupled consumer version is pinned to DCurses 2.2.0, whose source declares Terminal 1.18.0 as its sole production dependency; DCurses 1.6.0 remains a separate compatibility gate. A separate synthetic test harness supplies the legacy TermInfo-bearing provider setup while the controlled renderer consumer retains its source/reference boundary checks. The existing `tools/dcurses-screen-contracts-acceptance/Source/Program.cs` exercises value contracts at entry, but its `FutureDcursesRenderer.RefreshAsync(...)` method is only compile-bound. Executing a representative refresh is therefore a concrete Option 1 deliverable. Its baseline handling also needs to demonstrate that a missing rendition baseline cannot establish known physical state. @@ -287,9 +287,9 @@ No Terminal-owned cells/windows/layout/damage engine; no automatic replay or ret ## Authorities - [Main roadmap](Icod.Terminal-Development-Roadmap.md) -- [1.17 screen-output design](docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md) -- [1.18 rendition-baseline design](docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md) -- [Architecture](docs/Architecture.md) -- [Compatibility and versioning](docs/Compatibility-and-Versioning.md) -- [Security and privacy](docs/Security-and-Privacy.md) -- [Build and packaging workflow](packaging/README.md) +- [1.17 screen-output design](superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md) +- [1.18 rendition-baseline design](superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md) +- [Architecture](Architecture.md) +- [Compatibility and versioning](Compatibility-and-Versioning.md) +- [Security and privacy](Security-and-Privacy.md) +- [Build and packaging workflow](../packaging/README.md) diff --git a/Icod.Terminal-1.20.0-Development-Roadmap.md b/docs/Icod.Terminal-1.20.0-Development-Roadmap.md similarity index 99% rename from Icod.Terminal-1.20.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.20.0-Development-Roadmap.md index f9906f84d..89b5c91d3 100644 --- a/Icod.Terminal-1.20.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.20.0-Development-Roadmap.md @@ -8,7 +8,7 @@ **Tech stack:** C# 13; .NET 8/9/10; PowerShell 5.1-compatible packaging scripts; cmd/sh. No Python or new tooling dependencies. -**Spec:** [1.20 profile/capability design](docs/superpowers/specs/2026-09-27-1.20.0-profile-capability-design.md). +**Spec:** [1.20 profile/capability design](superpowers/specs/2026-09-27-1.20.0-profile-capability-design.md). **Selected scope:** **3 + focused 6 + 10**. @@ -42,7 +42,7 @@ - Released baseline: tag `v1.19.0`, merge commit `b3f7adf929d36ea654f2116ad6132781edc3fb3b`, [PR #64](https://github.com/uniblab/Icod.Terminal/pull/64), [GitHub release](https://github.com/uniblab/Icod.Terminal/releases/tag/v1.19.0). - The final pre-merge dependency-refresh head `5849ec717ba59a37ec7395d11f5c892ef3f380b2` passed all nine jobs in [workflow 36296373936](https://github.com/uniblab/Icod.Terminal/actions/runs/36296373936). Its runtime matrix passed 2,402 unit tests and 15 integration tests per framework on Windows, Linux, and macOS. These are baseline results, not 1.20 qualification. -- Baseline API fingerprint on every framework: `48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d`. Preserve [1.19 evidence](docs/Public-API-Baseline-1.19.md); generate a separate 1.20 baseline after additive API review. +- Baseline API fingerprint on every framework: `48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d`. Preserve [1.19 evidence](Public-API-Baseline-1.19.md); generate a separate 1.20 baseline after additive API review. - `TerminalProfile.Create` currently projects color, attributes, absolute addressing, ACS, and visibility facts. Existing planner methods additionally cover alternative cursor routes, erase, character/line shifts, and scroll regions. - `TerminalSession.CapabilityInspection.cs` has twelve capability mappings and three active verification cases. The guide/sample's older nine/two inventory needs reconciliation. - Existing inspection/lifecycle/verification tests and package/sample scripts are reusable. Start with a coverage inventory; do not recreate already-proven tests. diff --git a/Icod.Terminal-1.21.0-Development-Roadmap.md b/docs/Icod.Terminal-1.21.0-Development-Roadmap.md similarity index 98% rename from Icod.Terminal-1.21.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.21.0-Development-Roadmap.md index 5ccf451c7..189282ae5 100644 --- a/Icod.Terminal-1.21.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.21.0-Development-Roadmap.md @@ -185,4 +185,4 @@ The user-visible phase form and cursor API were frozen before production code. T New query families or a general query router redesign, raw vendor input events, xterm `modifyOtherKeys` mutation without a truthful restore path, global hotkeys, OS/IME control, unbounded paste assembly, terminal-brand heuristics, permanent cursor visibility inside a one-shot transaction, retained-screen/layout/damage policy, animation composition, new image protocols, transport/PTY hosting, and broad public extensibility remain outside 1.21.0. Scripted verification is not physical-emulator certification or a measured performance claim. -**Source authorities:** [main roadmap](Icod.Terminal-Development-Roadmap.md), [input/event contract](docs/Input-and-Events.md), [modern keyboard contract](docs/Modern-Keyboard-Security-and-Compatibility.md), [presentation ownership](docs/Presentation-and-Reversible-State.md), [screen output](docs/Screen-Output.md), and [1.20 release roadmap](Icod.Terminal-1.20.0-Development-Roadmap.md). +**Source authorities:** [main roadmap](Icod.Terminal-Development-Roadmap.md), [input/event contract](Input-and-Events.md), [modern keyboard contract](Modern-Keyboard-Security-and-Compatibility.md), [presentation ownership](Presentation-and-Reversible-State.md), [screen output](Screen-Output.md), and [1.20 release roadmap](Icod.Terminal-1.20.0-Development-Roadmap.md). diff --git a/Icod.Terminal-1.22.0-Development-Roadmap.md b/docs/Icod.Terminal-1.22.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-1.22.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.22.0-Development-Roadmap.md diff --git a/Icod.Terminal-1.23.0-Development-Roadmap.md b/docs/Icod.Terminal-1.23.0-Development-Roadmap.md similarity index 98% rename from Icod.Terminal-1.23.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.23.0-Development-Roadmap.md index 2defd97a1..41b496af6 100644 --- a/Icod.Terminal-1.23.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.23.0-Development-Roadmap.md @@ -6,7 +6,7 @@ **Selected scope:** Option 2 + Option 9 + Option 10. -**Design authority:** [`docs/superpowers/specs/2026-10-02-1.23.0-partial-frame-rich-input-design.md`](docs/superpowers/specs/2026-10-02-1.23.0-partial-frame-rich-input-design.md) +**Design authority:** [`docs/superpowers/specs/2026-10-02-1.23.0-partial-frame-rich-input-design.md`](superpowers/specs/2026-10-02-1.23.0-partial-frame-rich-input-design.md) **Compatibility:** Preserve the stable 1.0.0 floor, existing public enum values, one authoritative input reader, opaque raster identities, and the .NET 8/9/10 target matrix. Production dependencies remain narrow; no PTY, image-codec, or Inspection dependency enters the production graph. diff --git a/Icod.Terminal-1.24.0-Development-Roadmap.md b/docs/Icod.Terminal-1.24.0-Development-Roadmap.md similarity index 98% rename from Icod.Terminal-1.24.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.24.0-Development-Roadmap.md index baaf3bf6f..70af34480 100644 --- a/Icod.Terminal-1.24.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.24.0-Development-Roadmap.md @@ -6,9 +6,9 @@ **Release theme:** Raster Geometry and Planning Contracts. -**Design authority:** [`docs/superpowers/specs/2026-10-02-1.24.0-raster-geometry-planning-design.md`](docs/superpowers/specs/2026-10-02-1.24.0-raster-geometry-planning-design.md) +**Design authority:** [`docs/superpowers/specs/2026-10-02-1.24.0-raster-geometry-planning-design.md`](superpowers/specs/2026-10-02-1.24.0-raster-geometry-planning-design.md) -**Implementation authority:** [`docs/superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md`](docs/superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md) +**Implementation authority:** [`docs/superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md`](superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md) **Compatibility:** Preserve the stable 1.0.0 floor, existing public signatures and enum values, one authoritative input/query path, opaque raster identities, no hidden replay, and the .NET 8/9/10 target matrix. Production dependencies remain `Icod.TermInfo 1.17.0` and `Icod.Timing 1.0.0`; optional integration remains outside the production graph. diff --git a/Icod.Terminal-1.25.0-Development-Roadmap.md b/docs/Icod.Terminal-1.25.0-Development-Roadmap.md similarity index 96% rename from Icod.Terminal-1.25.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.25.0-Development-Roadmap.md index b644d9713..25414fd36 100644 --- a/Icod.Terminal-1.25.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.25.0-Development-Roadmap.md @@ -6,9 +6,9 @@ **Release theme:** Ordered Screen Raster Transactions. -**Design authority:** [`docs/superpowers/specs/2026-10-03-1.25.0-screen-raster-transactions-design.md`](docs/superpowers/specs/2026-10-03-1.25.0-screen-raster-transactions-design.md) +**Design authority:** [`docs/superpowers/specs/2026-10-03-1.25.0-screen-raster-transactions-design.md`](superpowers/specs/2026-10-03-1.25.0-screen-raster-transactions-design.md) -**Implementation authority:** [`docs/superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md`](docs/superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md) +**Implementation authority:** [`docs/superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md`](superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md) **Baseline:** Published `Icod.Terminal 1.24.1`, merged through [PR #70](https://github.com/uniblab/Icod.Terminal/pull/70) at `b6830ce4d7f6c97ffd9bf5e8fcbcf822febf59ea`. Production dependencies are `Icod.TermInfo 1.17.0` and `Icod.Timing 1.0.0`. @@ -20,7 +20,7 @@ The maintainer directs that this graphics track be put on hold because Kitty support cannot currently be properly tested and qualified. Preserve the published alpha.5 implementation and existing public contracts. Do not add a Kitty identifier workaround, animation-control change, backend retry, probe expansion or further -graphics feature. The [hold record](docs/Graphics-Development-Hold.md) preserves +graphics feature. The [hold record](Graphics-Development-Hold.md) preserves confirmed evidence, limits, and conditions for a separately approved reopening. This decision supersedes the live-test follow-ups below that ask for additional @@ -278,8 +278,8 @@ No Sixel persistent resource, Unicode placeholder, frame copy/update/select, spa | T2504–T2506 alpha qualification | [run 37127949385](https://github.com/uniblab/Icod.Terminal/actions/runs/37127949385) | Package candidate passed; full matrix in progress; API fingerprint `886a617d961af7eed37feaed026d83bbf06ec508ba248a4ca492baaf7e528146` | | Alpha.5 transfer-deadline regression | [run 37216285886](https://github.com/uniblab/Icod.Terminal/actions/runs/37216285886) | Matching large root/frame fixture fails at the intended two-second pending assertion under the fixed one-second deadline | | Alpha.5 transfer-deadline fix | [run 37216475686](https://github.com/uniblab/Icod.Terminal/actions/runs/37216475686) | Windows/Linux/macOS runtime, all package shards and validated package artifact pass | -| Graphics hold, 2026-10-04 | Maintainer decision; [hold record](docs/Graphics-Development-Hold.md) | Alpha.5 published; missing Kitty animation-upload ACK unresolved; further graphics development/live qualification deferred | -| Stable source preparation | [PR #78](https://github.com/uniblab/Icod.Terminal/pull/78) / [closure record](docs/T2508-1.25-Stable-Source-Closure.md) | Stable metadata and consumer release notes; exact stable-version matrix required; no runtime change or Kitty workaround | +| Graphics hold, 2026-10-04 | Maintainer decision; [hold record](Graphics-Development-Hold.md) | Alpha.5 published; missing Kitty animation-upload ACK unresolved; further graphics development/live qualification deferred | +| Stable source preparation | [PR #78](https://github.com/uniblab/Icod.Terminal/pull/78) / [closure record](T2508-1.25-Stable-Source-Closure.md) | Stable metadata and consumer release notes; exact stable-version matrix required; no runtime change or Kitty workaround | ## Stable release preparation — 2026-10-04 @@ -289,7 +289,7 @@ limits, without reopening graphics development. This decision supersedes any older requirement to obtain persistent Kitty ATLAS live acceptance before stable preparation; it does not count that acceptance as passed. -The [closure record](docs/T2508-1.25-Stable-Source-Closure.md) defines the scoped +The [closure record](T2508-1.25-Stable-Source-Closure.md) defines the scoped release boundary and exact-head gates. Runtime, package/API/XML, fresh consumer and dependency checks must all pass at the stable-version source in PR #78. Merge, mainline Release validation, tag and publication remain separate maintainer diff --git a/Icod.Terminal-1.26.0-Development-Roadmap.md b/docs/Icod.Terminal-1.26.0-Development-Roadmap.md similarity index 98% rename from Icod.Terminal-1.26.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.26.0-Development-Roadmap.md index 418891720..703e948ec 100644 --- a/Icod.Terminal-1.26.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.26.0-Development-Roadmap.md @@ -6,9 +6,9 @@ **Release theme:** Terminal Compatibility Qualification. -**Design authority:** [`docs/superpowers/specs/2026-10-04-1.26.0-terminal-compatibility-qualification-design.md`](docs/superpowers/specs/2026-10-04-1.26.0-terminal-compatibility-qualification-design.md) +**Design authority:** [`docs/superpowers/specs/2026-10-04-1.26.0-terminal-compatibility-qualification-design.md`](superpowers/specs/2026-10-04-1.26.0-terminal-compatibility-qualification-design.md) -**Implementation authority:** [`docs/superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md`](docs/superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md) +**Implementation authority:** [`docs/superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md`](superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md) **Baseline:** Stable `1.25.0` source merged through [PR #78](https://github.com/uniblab/Icod.Terminal/pull/78) at `7896879a31e8672683bbc6b7c4cf5f99fafc789a`; publication remains a separate maintainer action. PR head `2e4ed1875b44ab56947e07508278bc7f3b22e165` passed all nine jobs in [run 37229976172](https://github.com/uniblab/Icod.Terminal/actions/runs/37229976172): 2,584 unit tests and 15 TermInfo integration tests per framework on each operating system, plus the four package shards and validated artifact. The frozen API fingerprint is `886a617d961af7eed37feaed026d83bbf06ec508ba248a4ca492baaf7e528146`; package and symbol hashes were `0ec6df2f2d3b7f1d2d3476d8899590bd4b9716b80722a1eef038c6da94f4db2f` and `42c6c65ea101833406cf039037db647b118059223b2b48cdc9661f315bb587a8`. Production dependencies are `Icod.TermInfo 1.17.0` and `Icod.Timing 1.0.0`. diff --git a/Icod.Terminal-1.27.0-Development-Roadmap.md b/docs/Icod.Terminal-1.27.0-Development-Roadmap.md similarity index 98% rename from Icod.Terminal-1.27.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.27.0-Development-Roadmap.md index 6b250f728..712cd2337 100644 --- a/Icod.Terminal-1.27.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.27.0-Development-Roadmap.md @@ -16,7 +16,7 @@ **Tech stack:** C# 13; .NET 8/9/10; managed Windows/Linux/macOS; PowerShell 5.1-compatible packaging scripts and cmd/sh launchers. No Python or native companion component. -**Design authorities:** [Architecture](docs/Architecture.md), [compatibility policy](docs/Compatibility-and-Versioning.md), [security and privacy](docs/Security-and-Privacy.md), and the scope/contract requirements below. T2700 must record an approved detailed design and implementation plan before introducing public API. +**Design authorities:** [Architecture](Architecture.md), [compatibility policy](Compatibility-and-Versioning.md), [security and privacy](Security-and-Privacy.md), and the scope/contract requirements below. T2700 must record an approved detailed design and implementation plan before introducing public API. ## Scope and alternatives @@ -276,7 +276,7 @@ Dependencies remain Icod.TermInfo 1.17.0 and Icod.Timing 1.0.0. Historical 1.26 ## Partial live checkpoint — 2026-10-06 -Reviewed source-launcher reports for `a2bd1553765dee585607ea63de2ac6440f343fec`, `1.27.0-alpha.1`, Windows Terminal `1.24.11911.0`, Windows `10.0.26200.9457`, no separately recorded transport, and scenario revision 1. `query.appearance` is Inconclusive; `environment.appearance-reporting` and `environment.in-band-resize` are Unavailable after explicit mode state 0 or 4. The [evidence record](docs/compatibility/evidence/1.27.0/README.md) preserves the original JSON and the separate CI package identity; the [matrix](docs/compatibility/1.27.0.md) is regenerated from those reports. +Reviewed source-launcher reports for `a2bd1553765dee585607ea63de2ac6440f343fec`, `1.27.0-alpha.1`, Windows Terminal `1.24.11911.0`, Windows `10.0.26200.9457`, no separately recorded transport, and scenario revision 1. `query.appearance` is Inconclusive; `environment.appearance-reporting` and `environment.in-band-resize` are Unavailable after explicit mode state 0 or 4. The [evidence record](compatibility/evidence/1.27.0/README.md) preserves the original JSON and the separate CI package identity; the [matrix](compatibility/1.27.0.md) is regenerated from those reports. The submitted all-NotRun matrix predates report acceptance and is superseded by the generated matrix. No positive appearance or resize witness is present. The unavailable report's fallback note is not an input/geometry observation: `input.text-key/v1` and `lifecycle.resize-suspend/v1` must still be exercised in this environment. Tasks 9–10 remain incomplete and the package remains alpha.1. diff --git a/Icod.Terminal-1.28.0-Development-Roadmap.md b/docs/Icod.Terminal-1.28.0-Development-Roadmap.md similarity index 97% rename from Icod.Terminal-1.28.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.28.0-Development-Roadmap.md index 7cdd2aa5a..54cb4fb39 100644 --- a/Icod.Terminal-1.28.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.28.0-Development-Roadmap.md @@ -71,17 +71,17 @@ output. Higher layers continue to own cells, damage, atlas policy and fallback. 5.1-compatible packaging scripts and cmd/sh launchers. No Python, native helper, terminal-name branch or environment-variable support inference. -**Design authorities:** [Architecture](docs/Architecture.md), -[compatibility and versioning](docs/Compatibility-and-Versioning.md), -[security and privacy](docs/Security-and-Privacy.md), -[persistent raster ownership](docs/Persistent-Raster-Ownership.md), and the -[graphics hold/reopening record](docs/Graphics-Development-Hold.md). T2800 must +**Design authorities:** [Architecture](Architecture.md), +[compatibility and versioning](Compatibility-and-Versioning.md), +[security and privacy](Security-and-Privacy.md), +[persistent raster ownership](Persistent-Raster-Ownership.md), and the +[graphics hold/reopening record](Graphics-Development-Hold.md). T2800 must write the detailed design and implementation plan before runtime changes. **T2800 approved design:** -[Published-Spec Kitty Graphics Transactions Design](docs/superpowers/specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md), +[Published-Spec Kitty Graphics Transactions Design](superpowers/specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md), approved by the maintainer on 2026-10-06. The corresponding -[implementation plan](docs/superpowers/plans/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions.md) +[implementation plan](superpowers/plans/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions.md) is the executable RED/GREEN sequence and remains subject to plan review before runtime implementation begins. @@ -109,7 +109,7 @@ hardening-test failure. Exact runtime patch and clean/default-configuration provenance remain unrecorded. T2808 downstream ATLAS, the other implementation lane and complete T2810 closure remain open; stable metadata and publication are not authorized by these limited positive results. See the -[versioned compatibility record](docs/Kitty-Graphics-Transaction-Compatibility-1.28.md). +[versioned compatibility record](Kitty-Graphics-Transaction-Compatibility-1.28.md). ### Published-protocol policy diff --git a/Icod.Terminal-1.29.0-Development-Roadmap.md b/docs/Icod.Terminal-1.29.0-Development-Roadmap.md similarity index 99% rename from Icod.Terminal-1.29.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.29.0-Development-Roadmap.md index 7e305e5ec..0c8427578 100644 --- a/Icod.Terminal-1.29.0-Development-Roadmap.md +++ b/docs/Icod.Terminal-1.29.0-Development-Roadmap.md @@ -15,7 +15,7 @@ the next Terminal milestone before DCurses/Widgets editor work, and explicitly confirmed that 64 KiB is the correct default with larger buffers opt-in. **Status:** Implemented and qualified for stable `1.29.0` in PR #87. -See [qualification](docs/Clipboard-Transfer-Qualification-1.29.md) for automated +See [qualification](Clipboard-Transfer-Qualification-1.29.md) for automated results, measured allocation and outstanding live/release gates. Merge, tagging and publication remain maintainer actions. @@ -27,7 +27,7 @@ input reader, query transaction manager, serialized output and lifecycle ownersh **Tech Stack:** C# 13; net8.0/net9.0/net10.0; managed code; existing Icod.TermInfo 1.17.0 and Icod.Timing 1.0.0 dependencies; cmd/sh/PowerShell 5.1. -**Spec:** [Bounded Clipboard Transfers design](docs/Clipboard-Transfer-Design-1.29.md). +**Spec:** [Bounded Clipboard Transfers design](Clipboard-Transfer-Design-1.29.md). ## Global constraints diff --git a/Icod.Terminal-1.5.0-Development-Roadmap.md b/docs/Icod.Terminal-1.5.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-1.5.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.5.0-Development-Roadmap.md diff --git a/Icod.Terminal-1.6.0-Development-Roadmap.md b/docs/Icod.Terminal-1.6.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-1.6.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.6.0-Development-Roadmap.md diff --git a/Icod.Terminal-1.7.0-Development-Roadmap.md b/docs/Icod.Terminal-1.7.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-1.7.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.7.0-Development-Roadmap.md diff --git a/Icod.Terminal-1.8.0-Development-Roadmap.md b/docs/Icod.Terminal-1.8.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-1.8.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.8.0-Development-Roadmap.md diff --git a/Icod.Terminal-1.9.0-Development-Roadmap.md b/docs/Icod.Terminal-1.9.0-Development-Roadmap.md similarity index 100% rename from Icod.Terminal-1.9.0-Development-Roadmap.md rename to docs/Icod.Terminal-1.9.0-Development-Roadmap.md diff --git a/Icod.Terminal-Development-Roadmap.md b/docs/Icod.Terminal-Development-Roadmap.md similarity index 91% rename from Icod.Terminal-Development-Roadmap.md rename to docs/Icod.Terminal-Development-Roadmap.md index 3aca798de..05c56d516 100644 --- a/Icod.Terminal-Development-Roadmap.md +++ b/docs/Icod.Terminal-Development-Roadmap.md @@ -8,14 +8,14 @@ - **Latest historical patch line:** `1.24.1` — Persistent Kitty resource-identity verification. - **Development status:** Stable `1.29.0` release preparation; reviewed qualification is tracked in the versioned roadmap. - **Active development target:** `1.29.0` — Bounded Clipboard Transfers. -- **Selected scope:** Preserve the 65,536-byte default while allowing explicit larger read/write budgets, with coordinated codec/framing limits, bounded correlated response accumulation and truthful outcomes. See the [1.29 development roadmap](Icod.Terminal-1.29.0-Development-Roadmap.md) and [design](docs/Clipboard-Transfer-Design-1.29.md). +- **Selected scope:** Preserve the 65,536-byte default while allowing explicit larger read/write budgets, with coordinated codec/framing limits, bounded correlated response accumulation and truthful outcomes. See the [1.29 development roadmap](Icod.Terminal-1.29.0-Development-Roadmap.md) and [design](Clipboard-Transfer-Design-1.29.md). - **Stable compatibility floor:** `1.0.0` ## Purpose This file is the concise entry point for current `Icod.Terminal` development and long-range planning. Detailed design evidence remains in versioned roadmaps, release notes, public-API baselines, accepted CI checkpoints, and approved design/implementation documents. -The original pre-1.0 roadmap is preserved at [`docs/history/Icod.Terminal-Initial-Development-Roadmap.md`](docs/history/Icod.Terminal-Initial-Development-Roadmap.md). +The original pre-1.0 roadmap is preserved at [`docs/history/Icod.Terminal-Initial-Development-Roadmap.md`](history/Icod.Terminal-Initial-Development-Roadmap.md). ## Latest accepted checkpoint @@ -24,7 +24,7 @@ Stable `1.28.0` is present on main at [GitHub release](https://github.com/uniblab/Icod.Terminal/releases/tag/v1.28.0) was published 2026-10-09. The [1.28 development roadmap](Icod.Terminal-1.28.0-Development-Roadmap.md) and -[release notes](docs/releases/1.28.0.md) preserve the exact graphics and downstream +[release notes](releases/1.28.0.md) preserve the exact graphics and downstream qualification limits. This status does not expand their terminal coverage. On 2026-10-10 the maintainer selected clipboard enhancement before the next @@ -41,7 +41,7 @@ maintainer action. The entries below preserve earlier source/qualification milestones; their then-pending publication wording is historical, not the current release status. -Stable `Icod.Terminal 1.25.0` source was merged through [PR #78](https://github.com/uniblab/Icod.Terminal/pull/78) at `7896879a31e8672683bbc6b7c4cf5f99fafc789a`. The stable source preserves the documented graphics hold and does not claim successful Kitty persistent-ATLAS qualification. Stable publication remains a separate maintainer action; the [T2508 closure record](docs/T2508-1.25-Stable-Source-Closure.md) records the exact limits. +Stable `Icod.Terminal 1.25.0` source was merged through [PR #78](https://github.com/uniblab/Icod.Terminal/pull/78) at `7896879a31e8672683bbc6b7c4cf5f99fafc789a`. The stable source preserves the documented graphics hold and does not claim successful Kitty persistent-ATLAS qualification. Stable publication remains a separate maintainer action; the [T2508 closure record](T2508-1.25-Stable-Source-Closure.md) records the exact limits. `Icod.Terminal 1.25.0-alpha.5` was merged through [PR #77](https://github.com/uniblab/Icod.Terminal/pull/77) and published. It includes bounded payload-transfer deadlines plus the earlier Unix byte-input, DA1, cursor and Sixel corrections. The downstream Kitty 0.32.2 retest still lacks an animation-upload ACK; the longer deadline bounds the wait without fixing that defect. The maintainer has put this graphics track on hold. This checkpoint does not promote 1.25 to stable or qualify persistent ATLAS from ordinary FRAME fallback. @@ -136,11 +136,11 @@ The unchanged 1.18–1.19 public API fingerprint is: 48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d ``` -Permanent ownership authority: [`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md). +Permanent ownership authority: [`docs/Persistent-Raster-Ownership.md`](Persistent-Raster-Ownership.md). -1.17 release notes: [`docs/releases/1.17.0.md`](docs/releases/1.17.0.md). +1.17 release notes: [`docs/releases/1.17.0.md`](releases/1.17.0.md). -1.17 versioned evidence: [`Icod.Terminal-1.17.0-Development-Roadmap.md`](Icod.Terminal-1.17.0-Development-Roadmap.md). +1.17 versioned evidence: [`docs/Icod.Terminal-1.17.0-Development-Roadmap.md`](Icod.Terminal-1.17.0-Development-Roadmap.md). ## 1.16 stable release — Persistent Raster Animation and Frame Lifecycle @@ -233,12 +233,12 @@ Frame composition remains a strong candidate for a later focused release after t ## Authorities -- [`Icod.Terminal-1.16.0-Development-Roadmap.md`](Icod.Terminal-1.16.0-Development-Roadmap.md) -- [`docs/superpowers/specs/2026-09-15-1.16.0-persistent-raster-animation-frame-lifecycle-design.md`](docs/superpowers/specs/2026-09-15-1.16.0-persistent-raster-animation-frame-lifecycle-design.md) -- [`docs/Persistent-Raster-Ownership.md`](docs/Persistent-Raster-Ownership.md) -- [`docs/Architecture.md`](docs/Architecture.md) -- [`docs/Security-and-Privacy.md`](docs/Security-and-Privacy.md) -- [`docs/Compatibility-and-Versioning.md`](docs/Compatibility-and-Versioning.md) +- [`docs/Icod.Terminal-1.16.0-Development-Roadmap.md`](Icod.Terminal-1.16.0-Development-Roadmap.md) +- [`docs/superpowers/specs/2026-09-15-1.16.0-persistent-raster-animation-frame-lifecycle-design.md`](superpowers/specs/2026-09-15-1.16.0-persistent-raster-animation-frame-lifecycle-design.md) +- [`docs/Persistent-Raster-Ownership.md`](Persistent-Raster-Ownership.md) +- [`docs/Architecture.md`](Architecture.md) +- [`docs/Security-and-Privacy.md`](Security-and-Privacy.md) +- [`docs/Compatibility-and-Versioning.md`](Compatibility-and-Versioning.md) ## 1.17 stable line — Terminal-owned Screen Output Contracts @@ -265,9 +265,9 @@ T179 stable 1.17 release closure Authorities: -- [`Icod.Terminal-1.17.0-Development-Roadmap.md`](Icod.Terminal-1.17.0-Development-Roadmap.md) -- [`docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md`](docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md) -- [`docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md`](docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md) +- [`docs/Icod.Terminal-1.17.0-Development-Roadmap.md`](Icod.Terminal-1.17.0-Development-Roadmap.md) +- [`docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md`](superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md) +- [`docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md`](superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md) ## 1.18 stable line — Unknown-rendition Baseline Recovery @@ -300,9 +300,9 @@ T185 release-candidate qualification and stable 1.18.0 closure Authorities: -- [`Icod.Terminal-1.18.0-Development-Roadmap.md`](Icod.Terminal-1.18.0-Development-Roadmap.md) -- [`docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md`](docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md) -- [`docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md`](docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md) +- [`docs/Icod.Terminal-1.18.0-Development-Roadmap.md`](Icod.Terminal-1.18.0-Development-Roadmap.md) +- [`docs/superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md`](superpowers/specs/2026-09-18-1.18.0-rendition-baseline-design.md) +- [`docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md`](superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md) - [`Icod.DCurses 2.0 PR #32`](https://github.com/uniblab/Icod.DCurses/pull/32) ## 1.19 released line — Downstream Screen-output Hardening and Planner Expansion @@ -337,7 +337,7 @@ T199 stable 1.19.0 release closure and evidence record T190-T199 are complete and 1.19.0 is released. The final pre-merge head passed all nine CI jobs, including 2,402 unit tests and 15 integration tests per framework on each supported PR platform. The planner admits home-plus-relative and same-row carriage-return-plus-relative routes without public API additions; malformed optional routes cannot displace valid alternatives. Cursor-visibility composition is deferred to preserve presentation-lease ownership. The executed package harness covers the Terminal-only renderer, the screen-output sample, and published DCurses 2.2.0 while retaining the separate 1.6.0 compatibility witness. The release also includes the expanded samples, Ken Arnold attribution, and TermInfo/Inspection 1.16.0 dependency refresh. -Authority: [`Icod.Terminal-1.19.0-Development-Roadmap.md`](Icod.Terminal-1.19.0-Development-Roadmap.md). +Authority: [`docs/Icod.Terminal-1.19.0-Development-Roadmap.md`](Icod.Terminal-1.19.0-Development-Roadmap.md). ## 1.20 released line — Profile and Capability Decisions @@ -373,7 +373,7 @@ T200-T209 are complete; PR #65 has been merged and 1.20.0 published. The stable Authorities: - [1.20 development roadmap](Icod.Terminal-1.20.0-Development-Roadmap.md) -- [1.20 profile/capability design](docs/superpowers/specs/2026-09-27-1.20.0-profile-capability-design.md) +- [1.20 profile/capability design](superpowers/specs/2026-09-27-1.20.0-profile-capability-design.md) ## 1.21 development line — Rich Input and Cursor Visibility @@ -420,7 +420,7 @@ T2200–T2210 cover the protocol/API review, TermInfo 1.17.0 dependency qualific The selected scope is **Option 2 + Option 9 + Option 10**. Option 2 adds a bounded caller-supplied update to an existing known animation frame. Option 9 completes the remaining protocol-neutral rich-input and keyboard contract. Option 10 supplies samples, downstream package witnesses, documentation, measurement, and release qualification. -The approved [1.23 design](docs/superpowers/specs/2026-10-02-1.23.0-partial-frame-rich-input-design.md) and [1.23 development roadmap](Icod.Terminal-1.23.0-Development-Roadmap.md) govern implementation in [PR #68](https://github.com/uniblab/Icod.Terminal/pull/68). +The approved [1.23 design](superpowers/specs/2026-10-02-1.23.0-partial-frame-rich-input-design.md) and [1.23 development roadmap](Icod.Terminal-1.23.0-Development-Roadmap.md) govern implementation in [PR #68](https://github.com/uniblab/Icod.Terminal/pull/68). The governing rule is: @@ -438,7 +438,7 @@ The governing rule is: The 1.24 closure did not justify a bounded frame-edit execution release. The distinct 1.25 screen raster transaction scope is documented below. Frame-edit batching remains a separate measurement-gated candidate. No batch API, Indexed8 partial-update promise, remote atomicity, rollback, or hidden replay is precommitted. -The [1.24 design](docs/superpowers/specs/2026-10-02-1.24.0-raster-geometry-planning-design.md), [implementation plan](docs/superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md), and [1.24 development roadmap](Icod.Terminal-1.24.0-Development-Roadmap.md) record the published release from [PR #69](https://github.com/uniblab/Icod.Terminal/pull/69). +The [1.24 design](superpowers/specs/2026-10-02-1.24.0-raster-geometry-planning-design.md), [implementation plan](superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md), and [1.24 development roadmap](Icod.Terminal-1.24.0-Development-Roadmap.md) record the published release from [PR #69](https://github.com/uniblab/Icod.Terminal/pull/69). The implementation sequence is: @@ -464,7 +464,7 @@ The governing rule is: > Terminal owns raster backend evidence, protocol-private encoding, bounded transaction preflight, serialized output, and commitment uncertainty. DCurses owns raster-surface placement, source-image provision, clipping, overlay policy, damage, and refresh. Applications own assets and viewport content. -The [1.25 design](docs/superpowers/specs/2026-10-03-1.25.0-screen-raster-transactions-design.md), [implementation plan](docs/superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md), and [1.25 development roadmap](Icod.Terminal-1.25.0-Development-Roadmap.md) define the review gates. [Merged PR #71](https://github.com/uniblab/Icod.Terminal/pull/71) introduced the alpha API, tests, sample, package verifier and release documentation. Follow-up PRs #73–#77 are merged; alpha.5 is published. Further graphics development and Kitty live qualification are now on hold. Stable source qualification completed in merged PR #78 with those limits retained; publication remains a separate maintainer action. +The [1.25 design](superpowers/specs/2026-10-03-1.25.0-screen-raster-transactions-design.md), [implementation plan](superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md), and [1.25 development roadmap](Icod.Terminal-1.25.0-Development-Roadmap.md) define the review gates. [Merged PR #71](https://github.com/uniblab/Icod.Terminal/pull/71) introduced the alpha API, tests, sample, package verifier and release documentation. Follow-up PRs #73–#77 are merged; alpha.5 is published. Further graphics development and Kitty live qualification are now on hold. Stable source qualification completed in merged PR #78 with those limits retained; publication remains a separate maintainer action. ```text T2500 published baseline, placement assumptions, and API-regret gate @@ -517,7 +517,7 @@ T2609 reviewed live-terminal qualification T2610 cross-platform qualification and stable release closure ``` -The [1.26 design](docs/superpowers/specs/2026-10-04-1.26.0-terminal-compatibility-qualification-design.md), [implementation plan](docs/superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md), and [versioned development roadmap](Icod.Terminal-1.26.0-Development-Roadmap.md) define the full evidence model, scenario groups, privacy rules, failure semantics, and release gates. The published 1.26 feature adds no production runtime API and preserves the graphics-development hold. Remaining live-terminal coverage is a continuing qualification backlog, not an unimplemented runtime feature. +The [1.26 design](superpowers/specs/2026-10-04-1.26.0-terminal-compatibility-qualification-design.md), [implementation plan](superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md), and [versioned development roadmap](Icod.Terminal-1.26.0-Development-Roadmap.md) define the full evidence model, scenario groups, privacy rules, failure semantics, and release gates. The published 1.26 feature adds no production runtime API and preserves the graphics-development hold. Remaining live-terminal coverage is a continuing qualification backlog, not an unimplemented runtime feature. ## 1.27 merged line — Live Terminal Environment Awareness @@ -579,7 +579,7 @@ T2709 focused live-terminal acceptance T2710 stable release closure and exact evidence ``` -The [1.27 development roadmap](Icod.Terminal-1.27.0-Development-Roadmap.md) records completed scope, exact source/artifact/workflow identities, live versions, known limits, and review decisions. The approved [T2700 detailed design](docs/superpowers/specs/2026-10-05-terminal-appearance-resize-awareness-design.md) governs the additive public signatures and runtime semantics. Implementation remained inline without subagents; final review is an author self-review. +The [1.27 development roadmap](Icod.Terminal-1.27.0-Development-Roadmap.md) records completed scope, exact source/artifact/workflow identities, live versions, known limits, and review decisions. The approved [T2700 detailed design](superpowers/specs/2026-10-05-terminal-appearance-resize-awareness-design.md) governs the additive public signatures and runtime semantics. Implementation remained inline without subagents; final review is an author self-review. Stable acceptance now includes positive Kitty 0.49.2 evidence for both selected features and same-environment Windows Terminal/WSL evidence that unavailable reporting preserves native input and lifecycle. Ten-emulator completion is not implied. Curated notes, version metadata, packed README and required package-policy links passed together before separate maintainer promotion. @@ -665,7 +665,7 @@ unsupported functionality. No OSC 52 capacity negotiation is invented. | T2908 | Maintainer-reviewed release closure | See the [development roadmap](Icod.Terminal-1.29.0-Development-Roadmap.md) -and [design](docs/Clipboard-Transfer-Design-1.29.md). +and [design](Clipboard-Transfer-Design-1.29.md). MIME-aware OSC 5522 (earlier option 4) remains deferred; this decision enhances the existing OSC 52 path. No TermInfo or production dependency change is planned. No changes to DCurses/Widgets or the shared workflow-template repository are part @@ -677,7 +677,7 @@ of this milestone. Execution remains inline, without subagents. 1.28 transaction-conformance and downstream-ATLAS scope. Frame-edit batching, Indexed8 regional parity, gapless frames, placement expansion, image codecs, hidden replay and other graphics expansion remain deferred. No Kitty 0.49.2 wire -workaround is authorized. See the [hold and reopening record](docs/Graphics-Development-Hold.md). +workaround is authorized. See the [hold and reopening record](Graphics-Development-Hold.md). The deferred bounded frame-edit execution candidate may combine prevalidated region edits and final frame selection, and may add Indexed8 regional-transfer parity, only when a real DCurses workload demonstrates a material benefit. It must not claim remote atomicity or rollback. diff --git a/docs/Kitty-Graphics-Transaction-Compatibility-1.28.md b/docs/Kitty-Graphics-Transaction-Compatibility-1.28.md index 55717d5d5..96a52d707 100644 --- a/docs/Kitty-Graphics-Transaction-Compatibility-1.28.md +++ b/docs/Kitty-Graphics-Transaction-Compatibility-1.28.md @@ -204,4 +204,4 @@ The runnable public-only walkthrough is [`../samples/Icod.Terminal.RasterAnimation.Sample/README.md`](../samples/Icod.Terminal.RasterAnimation.Sample/README.md). The approved contract and its evidence boundaries are in the [`1.28 design`](superpowers/specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md) -and the [`1.28 roadmap`](../Icod.Terminal-1.28.0-Development-Roadmap.md). +and the [`1.28 roadmap`](Icod.Terminal-1.28.0-Development-Roadmap.md). diff --git a/docs/N159-1.5.0-Acceptance-Package-and-Documentation-Closure.md b/docs/N159-1.5.0-Acceptance-Package-and-Documentation-Closure.md index be5d77f0a..a1957b099 100644 --- a/docs/N159-1.5.0-Acceptance-Package-and-Documentation-Closure.md +++ b/docs/N159-1.5.0-Acceptance-Package-and-Documentation-Closure.md @@ -133,8 +133,8 @@ The 1.5 normalization preserves these release invariants: The final branch synchronizes: -- `Icod.Terminal-1.5.0-Development-Roadmap.md`; -- `Icod.Terminal-Development-Roadmap.md`; +- `docs/Icod.Terminal-1.5.0-Development-Roadmap.md`; +- `docs/Icod.Terminal-Development-Roadmap.md`; - `README.md`; - `CHANGELOG.md`; - `docs/releases/1.5.0.md`; diff --git a/docs/T120-1.12.0-Architecture-and-API-Regret-Gate.md b/docs/T120-1.12.0-Architecture-and-API-Regret-Gate.md index 30de42ec0..007938a58 100644 --- a/docs/T120-1.12.0-Architecture-and-API-Regret-Gate.md +++ b/docs/T120-1.12.0-Architecture-and-API-Regret-Gate.md @@ -92,7 +92,7 @@ T120 rejects the following from 1.12 scope: ## Authorities -- `Icod.Terminal-1.12.0-Development-Roadmap.md` +- `docs/Icod.Terminal-1.12.0-Development-Roadmap.md` - `docs/superpowers/specs/2026-09-12-1.12.0-advanced-raster-placement-design.md` - `docs/superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md` - `docs/Persistent-Raster-Ownership.md` diff --git a/docs/T12D-0.1.0-Release-Closure.md b/docs/T12D-0.1.0-Release-Closure.md index da47a45ab..97d9f77af 100644 --- a/docs/T12D-0.1.0-Release-Closure.md +++ b/docs/T12D-0.1.0-Release-Closure.md @@ -101,4 +101,4 @@ foundation, and the repository may advance to the `0.2.0` rich-input line without reopening the `0.1.0` feature scope. The `0.2.0` development roadmap is maintained in -[`Icod.Terminal-0.2.0-Development-Roadmap.md`](../Icod.Terminal-0.2.0-Development-Roadmap.md). +[`docs/Icod.Terminal-0.2.0-Development-Roadmap.md`](Icod.Terminal-0.2.0-Development-Roadmap.md). diff --git a/docs/history/Icod.Terminal-Initial-Development-Roadmap.md b/docs/history/Icod.Terminal-Initial-Development-Roadmap.md index 5ead647a8..5e4de50f8 100644 --- a/docs/history/Icod.Terminal-Initial-Development-Roadmap.md +++ b/docs/history/Icod.Terminal-Initial-Development-Roadmap.md @@ -12,7 +12,7 @@ **Immediate acceptance consumers:** `Icod.DCurses`, `watch`, `slabtop`, `top` **Status:** T27/T28A accepted; T28B stable `0.3.0` release commit prepared **Current tranche:** T28B — stable `0.3.0` release closure -**Current milestone roadmap:** [`Icod.Terminal-0.3.0-Development-Roadmap.md`](Icod.Terminal-0.3.0-Development-Roadmap.md) +**Current milestone roadmap:** [`docs/Icod.Terminal-0.3.0-Development-Roadmap.md`](../Icod.Terminal-0.3.0-Development-Roadmap.md) --- @@ -426,7 +426,7 @@ The tranche SHALL also define the namespace/type renaming strategy so the new li **Gate T02:** a written extraction matrix exists and the dependency graph can be made acyclic with `Icod.Terminal -> Icod.TermInfo` and no runtime dependency from `Icod.Terminal` back to `Icod.CommandFramework` or `Icod.DCurses`. -**T02 completion record:** [`docs/T02-Extraction-Inventory-and-Contract-Classification.md`](docs/T02-Extraction-Inventory-and-Contract-Classification.md). +**T02 completion record:** [`docs/T02-Extraction-Inventory-and-Contract-Classification.md`](../T02-Extraction-Inventory-and-Contract-Classification.md). --- @@ -512,7 +512,7 @@ A failed session open SHALL leave the host terminal as close as possible to its **Gate T05:** fault-injection tests prove restoration after success, exceptions, cancellation, failed initialization steps, and repeated disposal. -**T05 completion record:** [`docs/T05-TerminalSession-Lifecycle-and-Ownership.md`](docs/T05-TerminalSession-Lifecycle-and-Ownership.md). +**T05 completion record:** [`docs/T05-TerminalSession-Lifecycle-and-Ownership.md`](../T05-TerminalSession-Lifecycle-and-Ownership.md). --- @@ -536,7 +536,7 @@ The library SHALL also establish an explicit application-text encoding policy. C **Gate T06:** a standard live session can resolve a terminal description and emit capability-driven output without `Icod.DCurses` performing platform-specific terminal detection or Windows VT setup. -**T06 completion record:** [`docs/T06-Terminal-Identity-TermInfo-and-Output-Setup.md`](docs/T06-Terminal-Identity-TermInfo-and-Output-Setup.md). +**T06 completion record:** [`docs/T06-Terminal-Identity-TermInfo-and-Output-Setup.md`](../T06-Terminal-Identity-TermInfo-and-Output-Setup.md). --- @@ -562,7 +562,7 @@ Callbacks which execute in restricted host/runtime contexts SHALL do minimal wor **Gate T07:** resize wakes a waiting interactive loop, and suspend/resume or equivalent lifecycle disruption can restore/re-enter session state without leaving the terminal corrupted. -**T07 completion record:** [`docs/T07-Live-Dimensions-and-Lifecycle-Events.md`](docs/T07-Live-Dimensions-and-Lifecycle-Events.md). +**T07 completion record:** [`docs/T07-Live-Dimensions-and-Lifecycle-Events.md`](../T07-Live-Dimensions-and-Lifecycle-Events.md). --- @@ -608,7 +608,7 @@ Mouse, focus, bracketed paste, and modern keyboard protocols are not required fo **Gate T08:** scripted tests cover byte-by-byte fragmentation, combined reads, UTF-8, overlapping prefixes, isolated Escape, escape-prefixed keys, timeout behavior, cancellation, and resize wake-up. -**T08 completion record:** [`docs/T08-Input-Byte-Stream-and-Key-Event-Decoder.md`](docs/T08-Input-Byte-Stream-and-Key-Event-Decoder.md). +**T08 completion record:** [`docs/T08-Input-Byte-Stream-and-Key-Event-Decoder.md`](../T08-Input-Byte-Stream-and-Key-Event-Decoder.md). --- @@ -632,7 +632,7 @@ Where a terminal lacks a capability, the result SHALL be controlled rather than **Gate T09:** a test backend can verify exact enter/leave ordering, nested/repeated behavior, rollback after partial acquisition, and capability-driven output. -**T09 completion record:** [`docs/T09-Reversible-Terminal-Presentation-Leases.md`](docs/T09-Reversible-Terminal-Presentation-Leases.md). +**T09 completion record:** [`docs/T09-Reversible-Terminal-Presentation-Leases.md`](../T09-Reversible-Terminal-Presentation-Leases.md). --- @@ -656,7 +656,7 @@ Required coordinated work SHALL include: **Gate T10:** `Icod.DCurses` builds/tests without a runtime dependency on `Icod.CommandFramework.Terminal`, and its platform-specific terminal-mode implementation has been eliminated or reduced only to curses-specific policy. -**T10 integration record:** [`docs/T10-DCurses-Lifecycle-Participant-Integration.md`](docs/T10-DCurses-Lifecycle-Participant-Integration.md). +**T10 integration record:** [`docs/T10-DCurses-Lifecycle-Participant-Integration.md`](../T10-DCurses-Lifecycle-Participant-Integration.md). --- @@ -700,7 +700,7 @@ The acceptance work SHALL identify missing reusable mechanisms rather than solvi **Gate T11:** all three applications can run on the supported Windows, Linux, and macOS environments using the shared stack, with platform-specific limitations documented rather than hidden. -**T11 completion record:** [`docs/T11-ProcPs-Acceptance.md`](docs/T11-ProcPs-Acceptance.md). +**T11 completion record:** [`docs/T11-ProcPs-Acceptance.md`](../T11-ProcPs-Acceptance.md). --- @@ -715,21 +715,21 @@ T12 is the release-closure tranche for `0.1.0` and is executed in four subtranch **Gate T12A:** repository status documentation identifies T01-T11 as complete, makes T12 the active release tranche, and records the three ProcPs acceptance consumers. -**T12A completion record:** [`docs/T11-ProcPs-Acceptance.md`](docs/T11-ProcPs-Acceptance.md). +**T12A completion record:** [`docs/T11-ProcPs-Acceptance.md`](../T11-ProcPs-Acceptance.md). **Gate T12B:** the public 0.1 surface has an intentional review baseline, independent-consumer behavior is documented, and no unresolved API regret requiring a breaking pre-0.1 change remains. -**T12B completion records:** [`docs/T12B-Public-API-and-Consumer-Contract.md`](docs/T12B-Public-API-and-Consumer-Contract.md) and [`docs/Public-API-Baseline-0.1.md`](docs/Public-API-Baseline-0.1.md). +**T12B completion records:** [`docs/T12B-Public-API-and-Consumer-Contract.md`](../T12B-Public-API-and-Consumer-Contract.md) and [`docs/Public-API-Baseline-0.1.md`](../Public-API-Baseline-0.1.md). **Gate T12C:** the packed `.nupkg` and `.snupkg` pass structural, dependency-closure, symbol/Source Link, and fresh package-reference-only consumer validation for both supported target frameworks on Windows, Linux, and macOS. -**T12C completion record:** [`docs/T12C-Package-and-Fresh-Consumer-Validation.md`](docs/T12C-Package-and-Fresh-Consumer-Validation.md). +**T12C completion record:** [`docs/T12C-Package-and-Fresh-Consumer-Validation.md`](../T12C-Package-and-Fresh-Consumer-Validation.md). **Gate T12D:** the release commit declares `` and `` as exactly `0.1.0`, passes the normal three-host `main` Release validation, and is then tagged `v0.1.0`. The tag-controlled release workflow must verify that the tagged commit belongs to `main`, rerun the complete Release gate, publish the package to NuGet.org and GitHub Packages, and create the GitHub Release with package artifacts and SHA-256 checksums. Ordinary pushes to `main` SHALL validate but SHALL NOT publish packages. Publishing `0.1.0` is an explicit tag-controlled action. -**T12D release record:** [`docs/T12D-0.1.0-Release-Closure.md`](docs/T12D-0.1.0-Release-Closure.md). +**T12D release record:** [`docs/T12D-0.1.0-Release-Closure.md`](../T12D-0.1.0-Release-Closure.md). Before publishing `0.1.0`: @@ -752,7 +752,7 @@ Before publishing `0.1.0`: **Release gate `0.1.0`: complete.** The package is buildable and consumable independently, DCurses is integrated on top of it, and `watch`, `slabtop`, and `top` no longer require suite-private terminal-control implementations. The matching `v0.1.0` tag completed the three-host release workflow and published the non-prerelease package. -Completed `0.2.0` work is tracked in [`Icod.Terminal-0.2.0-Development-Roadmap.md`](Icod.Terminal-0.2.0-Development-Roadmap.md). Current `0.3.0` work is tracked in [`Icod.Terminal-0.3.0-Development-Roadmap.md`](Icod.Terminal-0.3.0-Development-Roadmap.md). +Completed `0.2.0` work is tracked in [`docs/Icod.Terminal-0.2.0-Development-Roadmap.md`](../Icod.Terminal-0.2.0-Development-Roadmap.md). Current `0.3.0` work is tracked in [`docs/Icod.Terminal-0.3.0-Development-Roadmap.md`](../Icod.Terminal-0.3.0-Development-Roadmap.md). --- @@ -803,7 +803,7 @@ A change which makes the isolated Terminal tests pass but forces DCurses or Proc ## 9. Public API Direction -The public `0.1.x` surface completed intentional review in T12B. The exact reviewed inventory is recorded in [`docs/Public-API-Baseline-0.1.md`](docs/Public-API-Baseline-0.1.md), and its behavioral/ownership contract is recorded in [`docs/T12B-Public-API-and-Consumer-Contract.md`](docs/T12B-Public-API-and-Consumer-Contract.md). +The public `0.1.x` surface completed intentional review in T12B. The exact reviewed inventory is recorded in [`docs/Public-API-Baseline-0.1.md`](../Public-API-Baseline-0.1.md), and its behavioral/ownership contract is recorded in [`docs/T12B-Public-API-and-Consumer-Contract.md`](../T12B-Public-API-and-Consumer-Contract.md). The baseline centers on `TerminalSession` / `TerminalSessionOptions`, endpoint and control contracts, semantic input modes, decoded input/lifecycle events, reversible presentation leases, and the intentionally public low-level snapshot/serialization/injection seams required by advanced consumers. OS-specific interop providers, decoder internals, lifecycle signal plumbing, and presentation composition remain internal. @@ -842,7 +842,7 @@ This tranche SHALL build on the 0.1 incremental decoder rather than introducing ### 10.2 Version 0.3 — Query/response routing The detailed milestone plan is maintained in -[`Icod.Terminal-0.3.0-Development-Roadmap.md`](Icod.Terminal-0.3.0-Development-Roadmap.md). +[`docs/Icod.Terminal-0.3.0-Development-Roadmap.md`](../Icod.Terminal-0.3.0-Development-Roadmap.md). Version 0.3 adds a common request/response mechanism for active terminal conversations, including device attributes, device status reports, diff --git a/docs/releases/1.10.0-alpha.1.md b/docs/releases/1.10.0-alpha.1.md index d877687d8..810ad4273 100644 --- a/docs/releases/1.10.0-alpha.1.md +++ b/docs/releases/1.10.0-alpha.1.md @@ -91,4 +91,4 @@ This fingerprint may advance during later reviewed 1.10 tranches. C108 performs ## Remaining 1.10 work -C105 and later tranches remain focused on lifecycle/invalidation and concurrent-query semantics, downstream planning acceptance, adversarial/package hardening, final public API/documentation freeze, and release closure. See `Icod.Terminal-1.10.0-Development-Roadmap.md`. +C105 and later tranches remain focused on lifecycle/invalidation and concurrent-query semantics, downstream planning acceptance, adversarial/package hardening, final public API/documentation freeze, and release closure. See `docs/Icod.Terminal-1.10.0-Development-Roadmap.md`. diff --git a/docs/releases/1.11.0.md b/docs/releases/1.11.0.md index f82edfd19..ec060b0a9 100644 --- a/docs/releases/1.11.0.md +++ b/docs/releases/1.11.0.md @@ -165,4 +165,4 @@ Higher-level screen/layout policy remains the responsibility of `Icod.DCurses`. Version 1.11 is an additive minor release over the stable `1.0.0` compatibility floor. Existing public signatures and enum numerics are preserved; `PersistentRasterGraphics` is appended at numeric value `9`. -See [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md) for the permanent compatibility policy and [`Icod.Terminal-1.11.0-Development-Roadmap.md`](../../Icod.Terminal-1.11.0-Development-Roadmap.md) for the complete development/qualification record. +See [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md) for the permanent compatibility policy and [`docs/Icod.Terminal-1.11.0-Development-Roadmap.md`](../Icod.Terminal-1.11.0-Development-Roadmap.md) for the complete development/qualification record. diff --git a/docs/releases/1.11.1.md b/docs/releases/1.11.1.md index b56b75300..b14d9e56a 100644 --- a/docs/releases/1.11.1.md +++ b/docs/releases/1.11.1.md @@ -125,4 +125,4 @@ The table-driven semantic-evidence cleanup remains a later independent change. S `Icod.Terminal 1.11.1` is a patch release over 1.11.0 and the stable `1.0.0` compatibility floor. It preserves the existing public API, enum numerics, runtime dependency boundary, and persistent-raster ownership contract. -See [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Capability-Inspection-and-Planning.md`](../Capability-Inspection-and-Planning.md), and [`Icod.Terminal-1.11.1-Development-Roadmap.md`](../../Icod.Terminal-1.11.1-Development-Roadmap.md) for the permanent and development contracts. +See [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Capability-Inspection-and-Planning.md`](../Capability-Inspection-and-Planning.md), and [`docs/Icod.Terminal-1.11.1-Development-Roadmap.md`](../Icod.Terminal-1.11.1-Development-Roadmap.md) for the permanent and development contracts. diff --git a/docs/releases/1.12.0.md b/docs/releases/1.12.0.md index 9a1382bf6..d0aea41ad 100644 --- a/docs/releases/1.12.0.md +++ b/docs/releases/1.12.0.md @@ -138,4 +138,4 @@ Version 1.12 does not add: Version 1.12 is an additive minor release over the stable `1.0.0` compatibility floor. Existing signatures and enum numeric values are preserved. Existing 1.11 persistent placement behavior is byte-for-byte preserved when `SourceRectangle` and `ZIndex` are not supplied. -See [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.12.md`](../Public-API-Baseline-1.12.md), and [`Icod.Terminal-1.12.0-Development-Roadmap.md`](../../Icod.Terminal-1.12.0-Development-Roadmap.md) for the permanent contract and development evidence. +See [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.12.md`](../Public-API-Baseline-1.12.md), and [`docs/Icod.Terminal-1.12.0-Development-Roadmap.md`](../Icod.Terminal-1.12.0-Development-Roadmap.md) for the permanent contract and development evidence. diff --git a/docs/releases/1.13.0.md b/docs/releases/1.13.0.md index 7e9ef4a94..f02a5e9e4 100644 --- a/docs/releases/1.13.0.md +++ b/docs/releases/1.13.0.md @@ -209,4 +209,4 @@ Package Stable 1.x release line Validated package artifact ``` -See [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.13.md`](../Public-API-Baseline-1.13.md), and [`Icod.Terminal-1.13.0-Development-Roadmap.md`](../../Icod.Terminal-1.13.0-Development-Roadmap.md) for the permanent contract and development evidence. +See [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.13.md`](../Public-API-Baseline-1.13.md), and [`docs/Icod.Terminal-1.13.0-Development-Roadmap.md`](../Icod.Terminal-1.13.0-Development-Roadmap.md) for the permanent contract and development evidence. diff --git a/docs/releases/1.14.0.md b/docs/releases/1.14.0.md index 888304ebe..9415d1d51 100644 --- a/docs/releases/1.14.0.md +++ b/docs/releases/1.14.0.md @@ -231,4 +231,4 @@ Validated package artifact This release-note file deliberately does not self-certify the commit that contains final release closure. Exact-head qualification is recorded on PR #58 after CI completes. Merge, tag, and publication remain maintainer actions. -For the permanent ownership contract, see `docs/Persistent-Raster-Ownership.md`. For tranche history and design constraints, see `Icod.Terminal-1.14.0-Development-Roadmap.md` and the 1.14 design/implementation-plan documents under `docs/superpowers/`. +For the permanent ownership contract, see `docs/Persistent-Raster-Ownership.md`. For tranche history and design constraints, see `docs/Icod.Terminal-1.14.0-Development-Roadmap.md` and the 1.14 design/implementation-plan documents under `docs/superpowers/`. diff --git a/docs/releases/1.15.0.md b/docs/releases/1.15.0.md index dce95afab..eee106f91 100644 --- a/docs/releases/1.15.0.md +++ b/docs/releases/1.15.0.md @@ -114,4 +114,4 @@ Version 1.15 is additive. Existing consumers that do not use placeholder APIs re Version 1.15 does not add animation/frame ownership, absolute screen-coordinate layout, pixel-within-cell positioning, a scene graph, Terminal-owned windows/cells/damage, public protocol identities, generic raw Kitty dispatch, Sixel placeholder emulation, hidden replay caches, image decoding/transcoding, or PTY/ConPTY hosting. -See [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Architecture.md`](../Architecture.md), [`Security-and-Privacy.md`](../Security-and-Privacy.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.15.md`](../Public-API-Baseline-1.15.md), and [`Icod.Terminal-1.15.0-Development-Roadmap.md`](../../Icod.Terminal-1.15.0-Development-Roadmap.md) for the permanent contract and development evidence. +See [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Architecture.md`](../Architecture.md), [`Security-and-Privacy.md`](../Security-and-Privacy.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.15.md`](../Public-API-Baseline-1.15.md), and [`docs/Icod.Terminal-1.15.0-Development-Roadmap.md`](../Icod.Terminal-1.15.0-Development-Roadmap.md) for the permanent contract and development evidence. diff --git a/docs/releases/1.16.0.md b/docs/releases/1.16.0.md index 8c5dddc9c..78894662e 100644 --- a/docs/releases/1.16.0.md +++ b/docs/releases/1.16.0.md @@ -99,4 +99,4 @@ Version 1.16 is additive. Existing consumers that do not use animation APIs reta Version 1.16 does not add partial-frame updates, frame composition/delta editing, gapless composition frames, absolute screen-coordinate placement, pixel-within-cell positioning, GIF/APNG or other image decoding, audio/timeline synchronization, Terminal-owned scene/window/cell/damage/layout policy, public protocol identities, generic raw Kitty dispatch, hidden replay caches, or PTY/ConPTY hosting. -See [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Architecture.md`](../Architecture.md), [`Security-and-Privacy.md`](../Security-and-Privacy.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.16.md`](../Public-API-Baseline-1.16.md), and [`Icod.Terminal-1.16.0-Development-Roadmap.md`](../../Icod.Terminal-1.16.0-Development-Roadmap.md) for the permanent contract and development evidence. +See [`Persistent-Raster-Ownership.md`](../Persistent-Raster-Ownership.md), [`Architecture.md`](../Architecture.md), [`Security-and-Privacy.md`](../Security-and-Privacy.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.16.md`](../Public-API-Baseline-1.16.md), and [`docs/Icod.Terminal-1.16.0-Development-Roadmap.md`](../Icod.Terminal-1.16.0-Development-Roadmap.md) for the permanent contract and development evidence. diff --git a/docs/releases/1.17.0.md b/docs/releases/1.17.0.md index cd005a443..78f7ce71b 100644 --- a/docs/releases/1.17.0.md +++ b/docs/releases/1.17.0.md @@ -82,4 +82,4 @@ Existing 1.x consumers do not need to adopt the new APIs. Existing `GetSize()`, New rendering code should prefer `GetDimensions()`, `Profile`, `Screen`, and `CreateScreenOutputTransaction(...)` when it needs a TermInfo-free semantic screen boundary. Callers must still retain their own cell model, width policy, layout, clipping, damage, comparison, and repaint decisions. -See [`Architecture.md`](../Architecture.md), [`Security-and-Privacy.md`](../Security-and-Privacy.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.17.md`](../Public-API-Baseline-1.17.md), and [`Icod.Terminal-1.17.0-Development-Roadmap.md`](../../Icod.Terminal-1.17.0-Development-Roadmap.md) for the permanent contract and development evidence. +See [`Architecture.md`](../Architecture.md), [`Security-and-Privacy.md`](../Security-and-Privacy.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Public-API-Baseline-1.17.md`](../Public-API-Baseline-1.17.md), and [`docs/Icod.Terminal-1.17.0-Development-Roadmap.md`](../Icod.Terminal-1.17.0-Development-Roadmap.md) for the permanent contract and development evidence. diff --git a/docs/releases/1.18.0.md b/docs/releases/1.18.0.md index 1058aadc9..64e30a9a7 100644 --- a/docs/releases/1.18.0.md +++ b/docs/releases/1.18.0.md @@ -43,4 +43,4 @@ The future-renderer witness proves that the candidate Terminal package supplies Tagging, GitHub Release creation, and NuGet publication remain explicit maintainer actions after candidate acceptance. -See [`Architecture.md`](../Architecture.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Security-and-Privacy.md`](../Security-and-Privacy.md), [`Public-API-Baseline-1.18.md`](../Public-API-Baseline-1.18.md), and [`Icod.Terminal-1.18.0-Development-Roadmap.md`](../../Icod.Terminal-1.18.0-Development-Roadmap.md) for the permanent contract and development evidence. +See [`Architecture.md`](../Architecture.md), [`Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md), [`Security-and-Privacy.md`](../Security-and-Privacy.md), [`Public-API-Baseline-1.18.md`](../Public-API-Baseline-1.18.md), and [`docs/Icod.Terminal-1.18.0-Development-Roadmap.md`](../Icod.Terminal-1.18.0-Development-Roadmap.md) for the permanent contract and development evidence. diff --git a/docs/releases/1.19.0.md b/docs/releases/1.19.0.md index 9ec79de31..f2d1f9fe4 100644 --- a/docs/releases/1.19.0.md +++ b/docs/releases/1.19.0.md @@ -28,6 +28,6 @@ Target frameworks remain `net8.0`, `net9.0`, and `net10.0`; the production TermI 48975f2c42f6c544e9c574a9b3d79f7e2b7b3ecb10ab1a5a0b7067749e38e65d ``` -The stable candidate passed all nine jobs in [workflow 36290312908](https://github.com/uniblab/Icod.Terminal/actions/runs/36290312908). Windows, Linux, and macOS each passed 2,402 unit tests and 15 integration tests per framework. Candidate-package, public-API, XML, dependency, downstream, and cross-platform evidence is recorded in the [1.19 roadmap](../../Icod.Terminal-1.19.0-Development-Roadmap.md#stable-candidate-qualification) and [PR #64](https://github.com/uniblab/Icod.Terminal/pull/64), with exact source and artifact hashes. Merge, tagging, release creation, and publication remain maintainer actions. +The stable candidate passed all nine jobs in [workflow 36290312908](https://github.com/uniblab/Icod.Terminal/actions/runs/36290312908). Windows, Linux, and macOS each passed 2,402 unit tests and 15 integration tests per framework. Candidate-package, public-API, XML, dependency, downstream, and cross-platform evidence is recorded in the [1.19 roadmap](../Icod.Terminal-1.19.0-Development-Roadmap.md#stable-candidate-qualification) and [PR #64](https://github.com/uniblab/Icod.Terminal/pull/64), with exact source and artifact hashes. Merge, tagging, release creation, and publication remain maintainer actions. See [Compatibility-and-Versioning.md](../Compatibility-and-Versioning.md), [Architecture.md](../Architecture.md), and [Public-API-Baseline-1.19.md](../Public-API-Baseline-1.19.md). diff --git a/docs/releases/1.20.0.md b/docs/releases/1.20.0.md index b280d22f4..74bf76ec6 100644 --- a/docs/releases/1.20.0.md +++ b/docs/releases/1.20.0.md @@ -30,10 +30,10 @@ Target frameworks remain `net8.0`, `net9.0`, and `net10.0`. Dependencies remain d308fb6ead5bd24c564d159297e6d08793c08eb4db21418eca6a5563aa5c4cbf ``` -The [1.20 roadmap](../../Icod.Terminal-1.20.0-Development-Roadmap.md#implementation-evidence) records regression evidence and qualification status. Required package witnesses retain DCurses 1.6.0, DCurses 2.2.0, the Terminal-only renderer, and the actual screen-output sample. Scripted coverage is not physical-emulator certification, performance benchmarking, or a fresh six-runner architecture matrix. Merge, tagging, release creation, and publication remain maintainer actions. +The [1.20 roadmap](../Icod.Terminal-1.20.0-Development-Roadmap.md#implementation-evidence) records regression evidence and qualification status. Required package witnesses retain DCurses 1.6.0, DCurses 2.2.0, the Terminal-only renderer, and the actual screen-output sample. Scripted coverage is not physical-emulator certification, performance benchmarking, or a fresh six-runner architecture matrix. Merge, tagging, release creation, and publication remain maintainer actions. See [Compatibility-and-Versioning.md](../Compatibility-and-Versioning.md), [Public-API-Baseline-1.20.md](../Public-API-Baseline-1.20.md), and [PR #65](https://github.com/uniblab/Icod.Terminal/pull/65). A second late-response regression is also corrected: keyboard flags belonging to a cancelled request cannot verify a newly queued request. Observation starts with that request's emission; earlier flags are drained under existing wire ownership without becoming new positive evidence. A negative Kitty observation still leaves independent keyboard backends unknown. -The stable checkpoint passed all nine jobs in [workflow 36302907074](https://github.com/uniblab/Icod.Terminal/actions/runs/36302907074): 2,465 unit tests and 15 integration tests per framework on Windows, Linux, and macOS, plus all package/sample/downstream gates. The [stable qualification record](../../Icod.Terminal-1.20.0-Development-Roadmap.md#stable-candidate-qualification) identifies the source, synthetic merge, artifact, package/symbol hashes, and final documentation-head validation policy. +The stable checkpoint passed all nine jobs in [workflow 36302907074](https://github.com/uniblab/Icod.Terminal/actions/runs/36302907074): 2,465 unit tests and 15 integration tests per framework on Windows, Linux, and macOS, plus all package/sample/downstream gates. The [stable qualification record](../Icod.Terminal-1.20.0-Development-Roadmap.md#stable-candidate-qualification) identifies the source, synthetic merge, artifact, package/symbol hashes, and final documentation-head validation policy. diff --git a/docs/releases/1.21.0.md b/docs/releases/1.21.0.md index bac03de50..9429c8603 100644 --- a/docs/releases/1.21.0.md +++ b/docs/releases/1.21.0.md @@ -20,4 +20,4 @@ Target frameworks are `net8.0`, `net9.0`, and `net10.0`. The only additive publi 939649e1d5c110039cfb3e5057561f8ef7fcb4de20af2de2152f9ec6ab357824 ``` -Production dependencies remain `Icod.TermInfo 1.16.0` and `Icod.Timing 1.0.0`; optional test/sample Inspection remains 1.16.0. The 1.0 stable compatibility floor and all 1.20 public signatures and enum values remain intact. Fresh-package checks cover the input fixture, screen sample, DCurses 1.6.0/2.2.0, and the Terminal-only renderer. See [Public-API-Baseline-1.21.md](../Public-API-Baseline-1.21.md), [Compatibility-and-Versioning.md](../Compatibility-and-Versioning.md), and the [1.21 development roadmap](../../Icod.Terminal-1.21.0-Development-Roadmap.md) for exact CI and artifact evidence. Scripted tests do not certify a physical terminal emulator. +Production dependencies remain `Icod.TermInfo 1.16.0` and `Icod.Timing 1.0.0`; optional test/sample Inspection remains 1.16.0. The 1.0 stable compatibility floor and all 1.20 public signatures and enum values remain intact. Fresh-package checks cover the input fixture, screen sample, DCurses 1.6.0/2.2.0, and the Terminal-only renderer. See [Public-API-Baseline-1.21.md](../Public-API-Baseline-1.21.md), [Compatibility-and-Versioning.md](../Compatibility-and-Versioning.md), and the [1.21 development roadmap](../Icod.Terminal-1.21.0-Development-Roadmap.md) for exact CI and artifact evidence. Scripted tests do not certify a physical terminal emulator. diff --git a/docs/releases/1.24.0.md b/docs/releases/1.24.0.md index f7d9abb89..526c0625d 100644 --- a/docs/releases/1.24.0.md +++ b/docs/releases/1.24.0.md @@ -40,4 +40,4 @@ Every 1.23 public signature and enum value remains available, and the stable 1.0 Version 1.24 does not add tile maps, cameras, scene graphs, asset decoding, palette policy, collision, visibility, game scheduling, batch edits, Indexed8 partial updates, gapless frames, remote-capacity queries, hidden replay, or PTY/ConPTY hosting. A possible 1.25 batch/Indexed8 release remains gated on a real DCurses package workload showing material need; this synthetic Terminal witness alone does not open or promise it. -See the [development roadmap](../../Icod.Terminal-1.24.0-Development-Roadmap.md), [public API baseline](../Public-API-Baseline-1.24.md), [persistent ownership guide](../Persistent-Raster-Ownership.md), and [measurement report](../Raster-Tile-Atlas-Measurement-1.24.md) for the complete contract and evidence. +See the [development roadmap](../Icod.Terminal-1.24.0-Development-Roadmap.md), [public API baseline](../Public-API-Baseline-1.24.md), [persistent ownership guide](../Persistent-Raster-Ownership.md), and [measurement report](../Raster-Tile-Atlas-Measurement-1.24.md) for the complete contract and evidence. diff --git a/docs/releases/1.25.0-alpha.4.md b/docs/releases/1.25.0-alpha.4.md index 1023e9c05..afa78f900 100644 --- a/docs/releases/1.25.0-alpha.4.md +++ b/docs/releases/1.25.0-alpha.4.md @@ -27,7 +27,7 @@ validation is unchanged. Explicit numeric zero attributes remain explicit. Public API and production dependencies are unchanged. Targets remain `net8.0`, `net9.0`, and `net10.0` on Windows, Linux and macOS. See -[Compatibility and Versioning](../../Compatibility-and-Versioning.md). +[Compatibility and Versioning](../Compatibility-and-Versioning.md). Regression coverage exercises 7-bit and C1 DA1 responses through public queries, ordinary graphics verification with and without a correlated Kitty response, diff --git a/docs/releases/1.25.0-alpha.md b/docs/releases/1.25.0-alpha.md index 3ccf3ced4..ac0469ad5 100644 --- a/docs/releases/1.25.0-alpha.md +++ b/docs/releases/1.25.0-alpha.md @@ -29,4 +29,4 @@ The maintainer observed the sample's colour gradient in Windows Terminal and Con - No portable graphics clipping, post-raster cursor position, scaling, alpha compositing, or physical display acknowledgement is promised. - Sixel does not gain persistent resources, placeholders, animation-frame updates, or hidden replay through this API. -See the [1.25 development roadmap](https://github.com/uniblab/Icod.Terminal/blob/main/Icod.Terminal-1.25.0-Development-Roadmap.md), [API baseline](https://github.com/uniblab/Icod.Terminal/blob/main/docs/Public-API-Baseline-1.25.md), and [changelog](https://github.com/uniblab/Icod.Terminal/blob/main/CHANGELOG.md). +See the [1.25 development roadmap](https://github.com/uniblab/Icod.Terminal/blob/main/docs/Icod.Terminal-1.25.0-Development-Roadmap.md), [API baseline](https://github.com/uniblab/Icod.Terminal/blob/main/docs/Public-API-Baseline-1.25.md), and [changelog](https://github.com/uniblab/Icod.Terminal/blob/main/CHANGELOG.md). diff --git a/docs/releases/1.26.0-alpha.md b/docs/releases/1.26.0-alpha.md index 053118d01..f81c576ac 100644 --- a/docs/releases/1.26.0-alpha.md +++ b/docs/releases/1.26.0-alpha.md @@ -22,4 +22,4 @@ The package gate compiles the sample against a freshly produced package and runs The alpha matrix now has reviewed `Pass` results for `identity.session/v1` and `query.dimensions/v1` in Windows Terminal 1.24.11911.0 on Windows Version 10.0.26200.9457, and in Kitty 0.32.2 on Ubuntu 24.04 through WSL 2.6.1.0. Those four results qualify no other scenario or terminal; every unrecorded scenario remains explicitly `NotRun`. Stable closure and broader cross-terminal qualification remain pending. -See the [compatibility matrix](../compatibility/1.26.0.md), [sample walkthrough](../../samples/Icod.Terminal.Compatibility.Sample/README.md), [compatibility policy](../Compatibility-and-Versioning.md), and [1.26 development roadmap](../../Icod.Terminal-1.26.0-Development-Roadmap.md). +See the [compatibility matrix](../compatibility/1.26.0.md), [sample walkthrough](../../samples/Icod.Terminal.Compatibility.Sample/README.md), [compatibility policy](../Compatibility-and-Versioning.md), and [1.26 development roadmap](../Icod.Terminal-1.26.0-Development-Roadmap.md). diff --git a/docs/releases/1.26.0.md b/docs/releases/1.26.0.md index 587227fa7..1f35bdb82 100644 --- a/docs/releases/1.26.0.md +++ b/docs/releases/1.26.0.md @@ -50,4 +50,4 @@ Interactive evidence remains maintainer-reviewed rather than fabricated by CI. Graphics qualification remains on hold and is outside this release's matrix. -See the [compatibility matrix](../compatibility/1.26.0.md), [evidence policy](../compatibility/README.md), [sample walkthrough](../../samples/Icod.Terminal.Compatibility.Sample/README.md), [compatibility policy](../Compatibility-and-Versioning.md), and [1.26 development roadmap](../../Icod.Terminal-1.26.0-Development-Roadmap.md). +See the [compatibility matrix](../compatibility/1.26.0.md), [evidence policy](../compatibility/README.md), [sample walkthrough](../../samples/Icod.Terminal.Compatibility.Sample/README.md), [compatibility policy](../Compatibility-and-Versioning.md), and [1.26 development roadmap](../Icod.Terminal-1.26.0-Development-Roadmap.md). diff --git a/docs/releases/1.27.0-alpha.1.md b/docs/releases/1.27.0-alpha.1.md index cbda0ece0..cad7dfde0 100644 --- a/docs/releases/1.27.0-alpha.1.md +++ b/docs/releases/1.27.0-alpha.1.md @@ -18,4 +18,4 @@ Existing 1.x public members and enum values remain unchanged. The package contin Terminal branding, successful writes, and protocol documentation are not support evidence. Positive appearance and resize support will be recorded only after bounded tests on exact terminal, operating-system, and transport versions. Graphics development remains on hold. -See the [1.27 development roadmap](../../Icod.Terminal-1.27.0-Development-Roadmap.md), [approved design](../superpowers/specs/2026-10-05-terminal-appearance-resize-awareness-design.md), and [compatibility policy](../Compatibility-and-Versioning.md). +See the [1.27 development roadmap](../Icod.Terminal-1.27.0-Development-Roadmap.md), [approved design](../superpowers/specs/2026-10-05-terminal-appearance-resize-awareness-design.md), and [compatibility policy](../Compatibility-and-Versioning.md). diff --git a/docs/releases/1.27.0.md b/docs/releases/1.27.0.md index 33f789a9e..0c1455e7f 100644 --- a/docs/releases/1.27.0.md +++ b/docs/releases/1.27.0.md @@ -67,7 +67,7 @@ Validated CI artifact `icod-terminal-pr-packages` (ID `11420808304`) embeds synt | Release Icod.Terminal.1.27.0.nupkg | `4aaee4e1b8b6c289050b17addbea79ab6aa52d2bbd0029310c4fd5a0a194c6a3` | | Release Icod.Terminal.1.27.0.snupkg | `dd60209b8a71b3944890165204d6db4c21e84b322963c17aa2ad1b86c15a268e` | -Initial stable metadata head `145b67b` failed the packed-README release-line gate in [workflow 37479150687](https://github.com/uniblab/Icod.Terminal/actions/runs/37479150687), job `112323069270`: forbidden candidate wording remained in its status and an older heading. A local Release check reproduced the failure. README-only corrective commit `cfd9126` passed the unchanged gate locally and in the complete new exact-head workflow above. Earlier artifacts are not substituted for this qualified head. Full provenance, inline review decisions, and known limits are retained in the [1.27 roadmap](../../Icod.Terminal-1.27.0-Development-Roadmap.md). +Initial stable metadata head `145b67b` failed the packed-README release-line gate in [workflow 37479150687](https://github.com/uniblab/Icod.Terminal/actions/runs/37479150687), job `112323069270`: forbidden candidate wording remained in its status and an older heading. A local Release check reproduced the failure. README-only corrective commit `cfd9126` passed the unchanged gate locally and in the complete new exact-head workflow above. Earlier artifacts are not substituted for this qualified head. Full provenance, inline review decisions, and known limits are retained in the [1.27 roadmap](../Icod.Terminal-1.27.0-Development-Roadmap.md). The fresh local Release package at `cfd9126` passed artifact/API/XML/dependency/document verification, environment-awareness and stable-release fresh consumers, and compatibility acceptance for both 1.26 and 1.27 on all three frameworks. The full local Release runtime/source/downstream run also passed; it began before the README-only fix, so the exact-head CI workflow remains the primary runtime source qualification. Final review was performed inline by the author under the maintainer's no-subagent instruction; no Critical, Important, or deferred Minor findings remain. Independent maintainer review remains separate from this self-review. diff --git a/docs/releases/1.28.0-alpha.1.md b/docs/releases/1.28.0-alpha.1.md index 84cc8e46b..205199968 100644 --- a/docs/releases/1.28.0-alpha.1.md +++ b/docs/releases/1.28.0-alpha.1.md @@ -80,7 +80,7 @@ The additive API snapshot is byte-identical across all three target frameworks a SHA-256 `0cad933938bf9d52ecd568323f05fdc9079597e6ed3029755a74fffead7c0fcc`; see the [1.28 public API baseline](../Public-API-Baseline-1.28.md). -See the [1.28 development roadmap](../../Icod.Terminal-1.28.0-Development-Roadmap.md), +See the [1.28 development roadmap](../Icod.Terminal-1.28.0-Development-Roadmap.md), [approved design](../superpowers/specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md), [implementation plan](../superpowers/plans/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions.md), and [compatibility policy](../Compatibility-and-Versioning.md). diff --git a/docs/releases/1.29.2.md b/docs/releases/1.29.2.md new file mode 100644 index 000000000..b03901185 --- /dev/null +++ b/docs/releases/1.29.2.md @@ -0,0 +1,54 @@ +# Icod.Terminal 1.29.2 + +This patch corrects two Windows console setup defects exposed by live +qualification of an application using Icod.DCurses and Icod.Widgets. + +## UTF-8 console output + +The default system-backed output transport writes the session's UTF-8 bytes to +the Windows console. Earlier releases enabled virtual-terminal processing but +left the console output code page unchanged. On an OEM code page, a single +box-drawing character such as `─` could therefore appear as several characters, +breaking retained cell geometry, popup borders and dialog placement. + +A system-backed Windows session now acquires UTF-8 console-output decoding with +its virtual-terminal output lease. Setup captures the exact prior output code +page, changes it only when necessary, rolls back partial setup, and restores the +captured value on lifecycle release or final disposal. Lifecycle re-entry +reacquires the same requirements. Redirected output, explicit output services +and `ConfigureOutput = false` retain their existing caller-owned behavior. + +## Mouse input ownership + +Windows Raw and CBreak input policy now enables virtual-terminal input, +`ENABLE_MOUSE_INPUT`, and `ENABLE_EXTENDED_FLAGS`, and clears Quick Edit while +the session owns the console. This prevents console text-selection policy from +consuming application mouse interaction. Raw continues to disable processed +input so Ctrl+C and Ctrl+Z can be application commands; CBreak continues to +retain processed-input behavior. Canonical mode remains unchanged. Session +cleanup restores the complete captured input mode, including unrelated flags. + +Mouse protocol reporting remains explicit and reversible through +`AcquireInputProtocolsAsync(...)`. The console-mode change makes that existing +lease dependable on Windows; it does not enable application mouse reporting by +itself and does not change the public input-event model. + +## Compatibility + +There are no public API or production dependency changes. Existing callers do +not need source changes. Targets remain `net8.0`, `net9.0`, and `net10.0`. +See the [compatibility policy](../Compatibility-and-Versioning.md). + +## Validation + +Cross-target tests cover UTF-8 acquisition, unchanged UTF-8 baselines, setup +failure, idempotent disposal, exact code-page restoration, Raw/CBreak mouse +flags, Quick Edit suppression, unrelated-bit preservation and existing mode +restoration. The isolated Windows CI smoke uses a private native console to +verify: + +- UTF-8 is active while the session owns byte-oriented output; +- writing `─` produces one box-drawing screen cell; +- Raw mode owns virtual-terminal and mouse input with Quick Edit disabled; +- Ctrl+C, Ctrl+Z, following input, Alt+F and Unicode remain intact; and +- the original input mode and output code page return after disposal. diff --git a/docs/releases/1.5.0.md b/docs/releases/1.5.0.md index 616a223f7..e7f653569 100644 --- a/docs/releases/1.5.0.md +++ b/docs/releases/1.5.0.md @@ -291,6 +291,6 @@ The normalization intentionally precedes: 1.8.0 APC foundation, Kitty Graphics, graphics backend routing ``` -The detailed 1.5 roadmap is `Icod.Terminal-1.5.0-Development-Roadmap.md`. +The detailed 1.5 roadmap is `docs/Icod.Terminal-1.5.0-Development-Roadmap.md`. The longer development path is recorded in `docs/Control-Language-Normalization-and-Graphics-Roadmap.md`. diff --git a/docs/releases/1.6.0.md b/docs/releases/1.6.0.md index e322d6c67..855c12d9f 100644 --- a/docs/releases/1.6.0.md +++ b/docs/releases/1.6.0.md @@ -130,7 +130,7 @@ Staging workflow `34394827411` qualified that closure checkpoint. The actual fin ## Documentation -- `Icod.Terminal-1.6.0-Development-Roadmap.md` +- `docs/Icod.Terminal-1.6.0-Development-Roadmap.md` - `docs/C160-Complete-CSI-Grammar-Foundation.md` - `docs/C161-Typed-CSI-Parameter-Semantics.md` - `docs/C162-Existing-CSI-Consolidation.md` diff --git a/docs/releases/1.8.0.md b/docs/releases/1.8.0.md index dcf7a6ab8..f7909122a 100644 --- a/docs/releases/1.8.0.md +++ b/docs/releases/1.8.0.md @@ -225,6 +225,6 @@ Each accepted checkpoint passed Runtime Windows, Runtime Linux, Runtime macOS, p A189 qualified package/documentation/compatibility closure on its accepted checkpoint. The actual final PR head then passed the same complete Staging matrix. PR #46 was subsequently merged, and `v1.8.0` was tagged and published as the stable multi-backend raster release. -See `Icod.Terminal-1.8.0-Development-Roadmap.md` and `docs/A180-APC-Construction-Contract-and-Reference-Freeze.md` through `docs/A189-1.8.0-Package-Documentation-Compatibility-and-Release-Closure.md` for detailed design and qualification evidence. +See `docs/Icod.Terminal-1.8.0-Development-Roadmap.md` and `docs/A180-APC-Construction-Contract-and-Reference-Freeze.md` through `docs/A189-1.8.0-Package-Documentation-Compatibility-and-Release-Closure.md` for detailed design and qualification evidence. The current stable release process is documented in `docs/Compatibility-and-Versioning.md` and `packaging/README.md`. diff --git a/docs/releases/1.8.1.md b/docs/releases/1.8.1.md index 75fd4f2d8..f2cec4426 100644 --- a/docs/releases/1.8.1.md +++ b/docs/releases/1.8.1.md @@ -57,9 +57,9 @@ See: - [`README.md`](../../README.md) - [`samples/README.md`](../../samples/README.md) -- [`Icod.Terminal-Development-Roadmap.md`](../../Icod.Terminal-Development-Roadmap.md) +- [`docs/Icod.Terminal-Development-Roadmap.md`](../Icod.Terminal-Development-Roadmap.md) - [`docs/Compatibility-and-Versioning.md`](../Compatibility-and-Versioning.md) - [`docs/Security-and-Privacy.md`](../Security-and-Privacy.md) - [`docs/releases/1.8.0.md`](1.8.0.md) -The detailed 1.8 design record remains preserved in `Icod.Terminal-1.8.0-Development-Roadmap.md` and the A180–A189 tranche documents. +The detailed 1.8 design record remains preserved in `docs/Icod.Terminal-1.8.0-Development-Roadmap.md` and the A180–A189 tranche documents. diff --git a/docs/superpowers/plans/2026-09-10-1.9.0-unsolicited-semantic-events.md b/docs/superpowers/plans/2026-09-10-1.9.0-unsolicited-semantic-events.md index 63aa66eaf..2974d5e13 100644 --- a/docs/superpowers/plans/2026-09-10-1.9.0-unsolicited-semantic-events.md +++ b/docs/superpowers/plans/2026-09-10-1.9.0-unsolicited-semantic-events.md @@ -8,7 +8,7 @@ **Tech Stack:** C# 13, .NET `net8.0`/`net9.0`/`net10.0`, xUnit, existing Icod.Terminal control-language/query infrastructure, existing Kitty OSC 99 encoder/query contracts. -**Spec:** `Icod.Terminal-1.9.0-Development-Roadmap.md` and `docs/E190-Unsolicited-Semantic-Event-Contract-and-Reference-Freeze.md` +**Spec:** `docs/Icod.Terminal-1.9.0-Development-Roadmap.md` and `docs/E190-Unsolicited-Semantic-Event-Contract-and-Reference-Freeze.md` ## Global Constraints @@ -166,7 +166,7 @@ ### Task 9: E199 release closure **Files:** -- Modify: `README.md`, `CHANGELOG.md`, `Icod.Terminal-Development-Roadmap.md`, `Icod.Terminal-1.9.0-Development-Roadmap.md` +- Modify: `README.md`, `CHANGELOG.md`, `docs/Icod.Terminal-Development-Roadmap.md`, `docs/Icod.Terminal-1.9.0-Development-Roadmap.md` - Modify: permanent input/query/notification/security/architecture/versioning docs - Create: `docs/releases/1.9.0.md` - Modify package version/release metadata and public API baseline files diff --git a/docs/superpowers/plans/2026-09-11-1.11.0-persistent-raster.md b/docs/superpowers/plans/2026-09-11-1.11.0-persistent-raster.md index 75baf6b4b..fc9bcc778 100644 --- a/docs/superpowers/plans/2026-09-11-1.11.0-persistent-raster.md +++ b/docs/superpowers/plans/2026-09-11-1.11.0-persistent-raster.md @@ -8,7 +8,7 @@ **Tech Stack:** C# 13, .NET `net8.0`/`net9.0`/`net10.0`, xUnit, existing APC/Kitty Graphics encoder/parser, `TerminalInputCoordinator`, `TerminalQueryTransactionManager`, semantic capability/evidence routing, PowerShell packaging verification, GitHub Actions Staging matrix. -**Spec:** `docs/superpowers/specs/2026-09-11-1.11.0-persistent-raster-design.md` and `Icod.Terminal-1.11.0-Development-Roadmap.md`. +**Spec:** `docs/superpowers/specs/2026-09-11-1.11.0-persistent-raster-design.md` and `docs/Icod.Terminal-1.11.0-Development-Roadmap.md`. ## Global Constraints @@ -33,7 +33,7 @@ ### Task 1: Activate the 1.11 development line and freeze C110 -**Files:** `Directory.Build.props`, `Icod.Terminal-1.11.0-Development-Roadmap.md`, new `docs/C110-Persistent-Raster-Architecture-and-API-Regret-Gate.md`. +**Files:** `Directory.Build.props`, `docs/Icod.Terminal-1.11.0-Development-Roadmap.md`, new `docs/C110-Persistent-Raster-Architecture-and-API-Regret-Gate.md`. - [ ] Set `VersionPrefix=1.11.0` and `VersionSuffix=alpha.1`; do not alter package dependency versions. - [ ] Mark C110 complete / C111 active in the 1.11 roadmap and record the approved public API, result semantics, registry ceilings, lifecycle rules, and exclusions. diff --git a/docs/superpowers/plans/2026-09-12-1.11.1-terminfo-persistent-raster-integration.md b/docs/superpowers/plans/2026-09-12-1.11.1-terminfo-persistent-raster-integration.md index 59ed34e7d..f1f50a20a 100644 --- a/docs/superpowers/plans/2026-09-12-1.11.1-terminfo-persistent-raster-integration.md +++ b/docs/superpowers/plans/2026-09-12-1.11.1-terminfo-persistent-raster-integration.md @@ -229,7 +229,7 @@ CI need not execute a real interactive graphics transaction; contract tests prov - Modify: `README.md` - Modify: `CHANGELOG.md` - Create: `docs/releases/1.11.1.md` -- Modify: `Icod.Terminal-1.11.1-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.11.1-Development-Roadmap.md` - Modify package/runtime verifier scripts only if required to compile the new sample/contract project; do not weaken existing gates. **Interfaces:** diff --git a/docs/superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md b/docs/superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md index 0ae9ab07d..f61a6a9e3 100644 --- a/docs/superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md +++ b/docs/superpowers/plans/2026-09-12-1.12.0-advanced-raster-placement.md @@ -28,7 +28,7 @@ ### Task 1: T120 planning closure and development version **Files:** -- Modify: `Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` - Modify: `Directory.Build.props` - Modify: `Icod.Terminal.csproj` @@ -465,8 +465,8 @@ docs: demonstrate advanced persistent raster placement - Modify: `Icod.Terminal.csproj` - Modify: `README.md` - Modify: `CHANGELOG.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.12.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.12.0-Development-Roadmap.md` - Modify: `docs/Architecture.md` - Modify: `docs/Persistent-Raster-Ownership.md` - Modify: `docs/Security-and-Privacy.md` diff --git a/docs/superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md b/docs/superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md index 11badf065..e8e1b65c7 100644 --- a/docs/superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md +++ b/docs/superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md @@ -30,8 +30,8 @@ ### Task 1: T130 architecture/API regret gate and roadmap authorities **Files:** -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Create: `Icod.Terminal-1.13.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Create: `docs/Icod.Terminal-1.13.0-Development-Roadmap.md` - Create: `docs/superpowers/specs/2026-09-12-1.13.0-relative-persistent-raster-placement-design.md` - Create: `docs/superpowers/plans/2026-09-12-1.13.0-relative-persistent-raster-placement.md` @@ -472,8 +472,8 @@ Commit offsets only after successful response parse and currentness check. - Modify: `Icod.Terminal.csproj` - Modify: `README.md` - Modify: `CHANGELOG.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.13.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.13.0-Development-Roadmap.md` - Modify: `docs/Architecture.md` - Modify: `docs/Persistent-Raster-Ownership.md` - Modify: `docs/Security-and-Privacy.md` diff --git a/docs/superpowers/plans/2026-09-13-1.14.0-persistent-raster-lifecycle-observability.md b/docs/superpowers/plans/2026-09-13-1.14.0-persistent-raster-lifecycle-observability.md index 8546d403a..8a3b7d79f 100644 --- a/docs/superpowers/plans/2026-09-13-1.14.0-persistent-raster-lifecycle-observability.md +++ b/docs/superpowers/plans/2026-09-13-1.14.0-persistent-raster-lifecycle-observability.md @@ -71,7 +71,7 @@ Samples/package/docs: - Create `docs/Public-API-Baseline-1.14.md` and final `docs/Public-API-Baseline-1.14.sha256` when the API is frozen. - Modify `docs/Persistent-Raster-Ownership.md`. - Create `docs/releases/1.14.0.md` during stable closure. -- Modify `CHANGELOG.md`, `Icod.Terminal.csproj`, `Icod.Terminal-Development-Roadmap.md`, and `Icod.Terminal-1.14.0-Development-Roadmap.md` only at the tranche that owns the corresponding release bookkeeping. +- Modify `CHANGELOG.md`, `Icod.Terminal.csproj`, `docs/Icod.Terminal-Development-Roadmap.md`, and `docs/Icod.Terminal-1.14.0-Development-Roadmap.md` only at the tranche that owns the corresponding release bookkeeping. --- @@ -85,7 +85,7 @@ Samples/package/docs: - Modify: `src/Graphics/TerminalRasterPlacement.cs` - Create: `tests/Icod.Terminal.Tests/src/Graphics/TerminalRasterOwnershipApiTests.cs` - Create: `docs/Public-API-Baseline-1.14.md` -- Modify: `Icod.Terminal-1.14.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.14.0-Development-Roadmap.md` **Interfaces:** - Produces: @@ -605,7 +605,7 @@ sample: demonstrate raster ownership lifecycle observation - Create: `docs/Public-API-Baseline-1.14.sha256` - Modify: `docs/Persistent-Raster-Ownership.md` - Modify: `README.md` -- Modify: `Icod.Terminal-1.14.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.14.0-Development-Roadmap.md` **Interfaces:** - Fresh package consumer compiles/executes all new public API on all TFMs. @@ -657,8 +657,8 @@ docs: qualify 1.14 raster lifecycle observability - Modify: `CHANGELOG.md` - Create: `docs/releases/1.14.0.md` - Modify: `README.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.14.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.14.0-Development-Roadmap.md` - Verify: `docs/Public-API-Baseline-1.14.md` - Verify: `docs/Public-API-Baseline-1.14.sha256` diff --git a/docs/superpowers/plans/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement.md b/docs/superpowers/plans/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement.md index 9e7aca425..ba2031b12 100644 --- a/docs/superpowers/plans/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement.md +++ b/docs/superpowers/plans/2026-09-14-1.15.0-unicode-placeholder-virtual-raster-placement.md @@ -542,8 +542,8 @@ git commit -am "test: qualify placeholder package surface" - Modify: `docs/Security-and-Privacy.md` - Modify: `docs/Compatibility-and-Versioning.md` - Modify: `samples/README.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.15.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.15.0-Development-Roadmap.md` **Interfaces:** - Produces permanent consumer/contributor authority matching implemented semantics. diff --git a/docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md b/docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md index ba14b8820..0a25156d4 100644 --- a/docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md +++ b/docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md @@ -26,8 +26,8 @@ **Files:** - Create: `docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md` - Create: `docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md` -- Create: `Icod.Terminal-1.17.0-Development-Roadmap.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` +- Create: `docs/Icod.Terminal-1.17.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` - Modify: `Directory.Build.props` - Modify: `Icod.Terminal.csproj` diff --git a/docs/superpowers/plans/2026-09-18-1.17.0-stable-closure.md b/docs/superpowers/plans/2026-09-18-1.17.0-stable-closure.md index bbe345618..51d57cf72 100644 --- a/docs/superpowers/plans/2026-09-18-1.17.0-stable-closure.md +++ b/docs/superpowers/plans/2026-09-18-1.17.0-stable-closure.md @@ -8,7 +8,7 @@ **Tech Stack:** C# 13, .NET 8/9/10, xUnit, PowerShell 5.1-compatible packaging scripts, GitHub Actions, NuGet package-only consumers. -**Design authority:** `Icod.Terminal-1.17.0-Development-Roadmap.md`, `docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md`, and `docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md`. +**Design authority:** `docs/Icod.Terminal-1.17.0-Development-Roadmap.md`, `docs/superpowers/specs/2026-09-17-1.17.0-terminal-screen-output-design.md`, and `docs/superpowers/plans/2026-09-17-1.17.0-terminal-screen-output.md`. ## Global constraints @@ -35,8 +35,8 @@ - Modify: `docs/Architecture.md` - Modify: `docs/Compatibility-and-Versioning.md` - Modify: `docs/Security-and-Privacy.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.17.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.17.0-Development-Roadmap.md` - [x] Change the repository version authority from `1.17.0-alpha.1` to stable candidate `1.17.0` by making `VersionSuffix` empty. - [x] Replace prerelease package notes with stable `1.17.0` notes linking `docs/releases/1.17.0.md` and the compatibility policy; add only search tags directly describing the new dimensions/profile/planning/transaction surface. @@ -96,8 +96,8 @@ Validated package artifact **Files:** -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.17.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.17.0-Development-Roadmap.md` - Modify: `docs/superpowers/plans/2026-09-18-1.17.0-stable-closure.md` - [x] Record the accepted candidate SHA, workflow/run identifier, all nine passing jobs, local verification counts, package identity, and unchanged API fingerprint. diff --git a/docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md b/docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md index be0c88569..ad1f5873e 100644 --- a/docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md +++ b/docs/superpowers/plans/2026-09-18-1.18.0-rendition-baseline.md @@ -131,8 +131,8 @@ - Modify: `Icod.Terminal.csproj` - Modify: `README.md` - Modify: `CHANGELOG.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.18.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.18.0-Development-Roadmap.md` - Create: `docs/releases/1.18.0.md` - Modify: `docs/Architecture.md` - Modify: `docs/Compatibility-and-Versioning.md` diff --git a/docs/superpowers/plans/2026-10-02-1.23.0-partial-frame-rich-input.md b/docs/superpowers/plans/2026-10-02-1.23.0-partial-frame-rich-input.md index 18af89111..cd6c5928b 100644 --- a/docs/superpowers/plans/2026-10-02-1.23.0-partial-frame-rich-input.md +++ b/docs/superpowers/plans/2026-10-02-1.23.0-partial-frame-rich-input.md @@ -33,7 +33,7 @@ ### Task 1: 1.23 baseline and RED contract fixtures **Files:** -- Modify: `Icod.Terminal-1.23.0-Development-Roadmap.md` evidence/checklist as decisions are frozen +- Modify: `docs/Icod.Terminal-1.23.0-Development-Roadmap.md` evidence/checklist as decisions are frozen - Test: `tests/Icod.Terminal.Tests/src/Graphics/TerminalRasterAnimationControlTests.cs` - Test: `tests/Icod.Terminal.Tests/src/Input/TerminalRichInputContractTests.cs` - Test: focused existing input decoder test files selected by the inventory @@ -197,8 +197,8 @@ ### Task 10: Cross-platform qualification and stable closure **Files:** -- Modify: `Icod.Terminal-1.23.0-Development-Roadmap.md` -- Modify: `Icod.Terminal-Development-Roadmap.md`, `CHANGELOG.md`, and `docs/releases/1.23.0.md` +- Modify: `docs/Icod.Terminal-1.23.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md`, `CHANGELOG.md`, and `docs/releases/1.23.0.md` - Modify: PR body with exact source/artifact evidence **Interfaces:** diff --git a/docs/superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md b/docs/superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md index 65aae85ad..f223f9caf 100644 --- a/docs/superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md +++ b/docs/superpowers/plans/2026-10-02-1.24.0-raster-geometry-planning.md @@ -59,7 +59,7 @@ **Files:** - Modify: `Directory.Build.props` - Modify: `Icod.Terminal.csproj` -- Modify: `Icod.Terminal-1.24.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.24.0-Development-Roadmap.md` - Create: `docs/Public-API-Baseline-1.24.md` - Create: `docs/Public-API-Baseline-1.24.sha256` - Test: `tests/Icod.Terminal.Tests/src/Session/TerminalSessionPublicSurfaceFreezeTests.cs` @@ -470,7 +470,7 @@ git commit -m "Add measured raster tile atlas witness" - Modify: `packaging/VerifyPublicApiBaseline.ps1` - Modify: `packaging/VerifyPackageArtifact.ps1` - Modify: `packaging/VerifyPersistentRasterPackage.ps1` -- Modify: `Icod.Terminal-1.24.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.24.0-Development-Roadmap.md` **Interfaces:** - Consumes: completed 1.24 implementation and measurement report. @@ -515,8 +515,8 @@ git commit -m "Document and qualify raster planning contracts" ### Task 9: T2409–T2410 downstream qualification and stable closure **Files:** -- Modify: `Icod.Terminal-1.24.0-Development-Roadmap.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.24.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` - Modify: `Directory.Build.props` - Modify: `Icod.Terminal.csproj` - Modify: `README.md` diff --git a/docs/superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md b/docs/superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md index 80aa66d69..446d1fe7d 100644 --- a/docs/superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md +++ b/docs/superpowers/plans/2026-10-03-1.25.0-screen-raster-transactions.md @@ -34,8 +34,8 @@ The following five failure classes must have explicit tests in the owning tasks: ### Task 1: T2500 contract and development identity **Files:** -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.25.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.25.0-Development-Roadmap.md` - Modify: `Directory.Build.props` - Modify: `Icod.Terminal.csproj` - Review: `src/Screen/TerminalScreenOutputTransaction.cs`, `src/Session/TerminalSession.RasterGraphics.cs` @@ -115,7 +115,7 @@ The following five failure classes must have explicit tests in the owning tasks: **Files:** - Modify: `README.md`, `CHANGELOG.md`, `docs/Compatibility-and-Versioning.md` -- Modify: `Icod.Terminal-1.25.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.25.0-Development-Roadmap.md` - Create: `docs/releases/1.25.0.md` - Create: `docs/Public-API-Baseline-1.25.md` and matching fingerprint record following existing release convention diff --git a/docs/superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md b/docs/superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md index 7616218b4..bab3043c5 100644 --- a/docs/superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md +++ b/docs/superpowers/plans/2026-10-04-1.26.0-terminal-compatibility-qualification.md @@ -33,8 +33,8 @@ ### Task 1: T2600 contract, baseline, and development identity **Files:** -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.26.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.26.0-Development-Roadmap.md` - Modify: `Directory.Build.props` - Modify: `Icod.Terminal.csproj` - Create: `docs/compatibility/README.md` @@ -143,7 +143,7 @@ - Modify: `samples/README.md` - Modify: `docs/Compatibility-and-Versioning.md` - Modify: `docs/Semantic-Output-Protocols.md` -- Modify: `Icod.Terminal-1.26.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.26.0-Development-Roadmap.md` **Interfaces:** Produces discoverable instructions, accepted evidence placement, matrix interpretation, privacy/side-effect guidance, contribution steps, and an initial deterministic matrix whose unqualified cells remain `NotRun`. @@ -157,8 +157,8 @@ **Files:** - Add: `docs/compatibility/evidence/1.26.0/*.json` - Regenerate: `docs/compatibility/1.26.0.md` -- Modify: `Icod.Terminal-1.26.0-Development-Roadmap.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.26.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` - Modify: `CHANGELOG.md` - Create: `docs/releases/1.26.0.md` - Create: `docs/Public-API-Baseline-1.26.md` diff --git a/docs/superpowers/plans/2026-10-05-terminal-appearance-resize-awareness.md b/docs/superpowers/plans/2026-10-05-terminal-appearance-resize-awareness.md index c6a7e88ea..a5f59d165 100644 --- a/docs/superpowers/plans/2026-10-05-terminal-appearance-resize-awareness.md +++ b/docs/superpowers/plans/2026-10-05-terminal-appearance-resize-awareness.md @@ -241,7 +241,7 @@ **Files:** - Add after review: `docs/compatibility/evidence/1.27.0/*.json` - Regenerate: `docs/compatibility/1.27.0.md` -- Modify: `Icod.Terminal-1.27.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.27.0-Development-Roadmap.md` **Interfaces:** - Consumes: Task 7 launchers and accepted evidence schema. @@ -275,8 +275,8 @@ Task 9 complete (2026-10-06): subsequent consented appearance and resize reporti - Modify: `Icod.Terminal.csproj` - Modify: `README.md` - Modify: `CHANGELOG.md` -- Modify: `Icod.Terminal-Development-Roadmap.md` -- Modify: `Icod.Terminal-1.27.0-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-Development-Roadmap.md` +- Modify: `docs/Icod.Terminal-1.27.0-Development-Roadmap.md` - Create: `docs/releases/1.27.0.md` - Modify: release/package workflow assertions only where the current release line is pinned diff --git a/docs/superpowers/plans/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions.md b/docs/superpowers/plans/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions.md index 75ca1b913..7cad20a6e 100644 --- a/docs/superpowers/plans/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions.md +++ b/docs/superpowers/plans/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions.md @@ -10,7 +10,7 @@ **Spec:** [`../specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md`](../specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md) -**Roadmap:** [`../../../Icod.Terminal-1.28.0-Development-Roadmap.md`](../../../Icod.Terminal-1.28.0-Development-Roadmap.md), tranches T2800-T2810. +**Roadmap:** [`../../Icod.Terminal-1.28.0-Development-Roadmap.md`](../../Icod.Terminal-1.28.0-Development-Roadmap.md), tranches T2800-T2810. **Execution selection:** After maintainer approval of this plan, execute inline in the main session without subagents. Use strict RED -> GREEN -> REFACTOR cycles and stop on a design contradiction rather than silently changing the approved contract. diff --git a/docs/superpowers/specs/2026-09-26-1.19.0-screen-output-hardening-design.md b/docs/superpowers/specs/2026-09-26-1.19.0-screen-output-hardening-design.md index e097195c9..ace22a458 100644 --- a/docs/superpowers/specs/2026-09-26-1.19.0-screen-output-hardening-design.md +++ b/docs/superpowers/specs/2026-09-26-1.19.0-screen-output-hardening-design.md @@ -1,6 +1,6 @@ # Icod.Terminal 1.19.0 Screen-output Hardening Design -The approved release scope is Option 1 + Option 2 + Option 4 + Option 10. The [implementation roadmap](../../../Icod.Terminal-1.19.0-Development-Roadmap.md) supplies the tranche sequence and release gates. This document records T190's implementation decisions. +The approved release scope is Option 1 + Option 2 + Option 4 + Option 10. The [implementation roadmap](../../Icod.Terminal-1.19.0-Development-Roadmap.md) supplies the tranche sequence and release gates. This document records T190's implementation decisions. ## Baseline and compatibility diff --git a/docs/superpowers/specs/2026-09-27-1.20.0-profile-capability-design.md b/docs/superpowers/specs/2026-09-27-1.20.0-profile-capability-design.md index 93e9fc6a2..5ce6d1491 100644 --- a/docs/superpowers/specs/2026-09-27-1.20.0-profile-capability-design.md +++ b/docs/superpowers/specs/2026-09-27-1.20.0-profile-capability-design.md @@ -4,7 +4,7 @@ **Selected scope:** **3 + focused 6 + 10** — terminal-profile refinement, existing capability-verification hardening, and documentation/samples. -**Implementation roadmap:** [Icod.Terminal-1.20.0-Development-Roadmap.md](../../../Icod.Terminal-1.20.0-Development-Roadmap.md). +**Implementation roadmap:** [Icod.Terminal-1.20.0-Development-Roadmap.md](../../Icod.Terminal-1.20.0-Development-Roadmap.md). ## Purpose and baseline diff --git a/docs/superpowers/specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md b/docs/superpowers/specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md index 708cfd88c..dcea338b6 100644 --- a/docs/superpowers/specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md +++ b/docs/superpowers/specs/2026-10-06-1.28.0-published-spec-kitty-graphics-transactions-design.md @@ -10,7 +10,7 @@ `485bedb014ab7b66391661c709833a6a4fa4afcc` **Roadmap:** -[`Icod.Terminal-1.28.0-Development-Roadmap.md`](../../../Icod.Terminal-1.28.0-Development-Roadmap.md) +[`docs/Icod.Terminal-1.28.0-Development-Roadmap.md`](../../Icod.Terminal-1.28.0-Development-Roadmap.md) ## 1. Intent and success criteria diff --git a/src/Platform/SystemTerminalOutputSetup.cs b/src/Platform/SystemTerminalOutputSetup.cs index fef472bb7..5ea2db411 100644 --- a/src/Platform/SystemTerminalOutputSetup.cs +++ b/src/Platform/SystemTerminalOutputSetup.cs @@ -61,8 +61,8 @@ bool configureOutput ) }; - IDisposable? lease = WindowsVirtualTerminal.TryEnableOutput( stream ); - if ( lease is null ) { + IDisposable? virtualTerminalLease = WindowsVirtualTerminal.TryEnableOutput( stream ); + if ( virtualTerminalLease is null ) { throw new InvalidOperationException( string.Concat( "Windows virtual-terminal output processing could not be enabled for ", @@ -72,6 +72,45 @@ bool configureOutput ); } - return lease; + try { + IDisposable? codePageLease = WindowsConsoleOutputCodePage.TryEnableUtf8(); + if ( codePageLease is null ) { + throw new InvalidOperationException( + string.Concat( + "UTF-8 Windows console output could not be enabled for ", + endpoint.DisplayName, + "." + ) + ); + } + return new OutputLease( virtualTerminalLease, codePageLease ); + } catch { + virtualTerminalLease.Dispose(); + throw; + } + } + + private sealed class OutputLease( + IDisposable virtualTerminalLease, + IDisposable codePageLease + ) : IDisposable { + private IDisposable? virtualTerminalLease = virtualTerminalLease; + private IDisposable? codePageLease = codePageLease; + + public void Dispose() { + IDisposable? codePage = Interlocked.Exchange( + ref this.codePageLease, + null + ); + IDisposable? virtualTerminal = Interlocked.Exchange( + ref this.virtualTerminalLease, + null + ); + try { + codePage?.Dispose(); + } finally { + virtualTerminal?.Dispose(); + } + } } } diff --git a/src/Platform/WindowsConsoleOutputCodePage.cs b/src/Platform/WindowsConsoleOutputCodePage.cs new file mode 100644 index 000000000..c79be076e --- /dev/null +++ b/src/Platform/WindowsConsoleOutputCodePage.cs @@ -0,0 +1,75 @@ +/* + Icod.Terminal + Managed, cross-platform live-terminal session and terminal-control library for .NET. + Copyright (C) 2026 Timothy J. Bruce +*/ + +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ +namespace Icod.Terminal; + +using System.Runtime.InteropServices; + +/// +/// Acquires reversible UTF-8 decoding for byte-oriented Windows console output. +/// +internal static class WindowsConsoleOutputCodePage { + private const uint Utf8CodePage = 65001U; + + internal static IDisposable? TryEnableUtf8() { + if ( !OperatingSystem.IsWindows() ) return null; + return TryEnableUtf8( GetConsoleOutputCP, SetConsoleOutputCP ); + } + + internal static IDisposable? TryEnableUtf8( + Func getOutputCodePage, + Func setOutputCodePage + ) { + ArgumentNullException.ThrowIfNull( getOutputCodePage ); + ArgumentNullException.ThrowIfNull( setOutputCodePage ); + + uint originalCodePage = getOutputCodePage(); + if ( 0U == originalCodePage ) return null; + bool restore = Utf8CodePage != originalCodePage; + if ( restore && !setOutputCodePage( Utf8CodePage ) ) return null; + return new Lease( setOutputCodePage, originalCodePage, restore ); + } + + private sealed class Lease( + Func setOutputCodePage, + uint originalCodePage, + bool restore + ) : IDisposable { + private Func? setOutputCodePage = setOutputCodePage; + + public void Dispose() { + Func? setter = Interlocked.Exchange( + ref this.setOutputCodePage, + null + ); + if ( setter is null || !restore ) return; + _ = setter( originalCodePage ); + } + } + +#pragma warning disable SYSLIB1054 // Match the existing platform interop boundary. + [DllImport( "kernel32.dll", SetLastError = true )] + private static extern uint GetConsoleOutputCP(); + + [DllImport( "kernel32.dll", SetLastError = true )] + [return: MarshalAs( UnmanagedType.Bool )] + private static extern bool SetConsoleOutputCP( uint codePage ); +#pragma warning restore SYSLIB1054 +} diff --git a/src/Platform/WindowsTerminalInputModeEditor.cs b/src/Platform/WindowsTerminalInputModeEditor.cs index bc6bec74d..01241f190 100644 --- a/src/Platform/WindowsTerminalInputModeEditor.cs +++ b/src/Platform/WindowsTerminalInputModeEditor.cs @@ -27,6 +27,9 @@ internal static class WindowsTerminalInputModeEditor { private const uint EnableProcessedInput = 0x0001U; private const uint EnableLineInput = 0x0002U; private const uint EnableEchoInput = 0x0004U; + private const uint EnableMouseInput = 0x0010U; + private const uint EnableQuickEditMode = 0x0040U; + private const uint EnableExtendedFlags = 0x0080U; private const uint EnableVirtualTerminalInput = 0x0200U; /// @@ -70,13 +73,22 @@ bool echoInput break; case TerminalInputMode.CBreak: - mode |= EnableProcessedInput | EnableVirtualTerminalInput; - mode &= ~EnableLineInput; + mode |= EnableProcessedInput + | EnableMouseInput + | EnableExtendedFlags + | EnableVirtualTerminalInput; + mode &= ~( EnableLineInput | EnableQuickEditMode ); break; case TerminalInputMode.Raw: - mode |= EnableVirtualTerminalInput; - mode &= ~( EnableProcessedInput | EnableLineInput ); + mode |= EnableMouseInput + | EnableExtendedFlags + | EnableVirtualTerminalInput; + mode &= ~( + EnableProcessedInput + | EnableLineInput + | EnableQuickEditMode + ); break; default: diff --git a/tests/Icod.Terminal.Tests/src/Control/TerminalInputModePolicyTests.cs b/tests/Icod.Terminal.Tests/src/Control/TerminalInputModePolicyTests.cs index ab7a821cd..8b20075f9 100644 --- a/tests/Icod.Terminal.Tests/src/Control/TerminalInputModePolicyTests.cs +++ b/tests/Icod.Terminal.Tests/src/Control/TerminalInputModePolicyTests.cs @@ -182,8 +182,8 @@ public void ConfiguresMacOsRawFlowControlBits() { /// [Theory] [InlineData( TerminalInputMode.Canonical, 0x0003U, 0x0200U )] - [InlineData( TerminalInputMode.CBreak, 0x0201U, 0x0002U )] - [InlineData( TerminalInputMode.Raw, 0x0200U, 0x0003U )] + [InlineData( TerminalInputMode.CBreak, 0x0291U, 0x0042U )] + [InlineData( TerminalInputMode.Raw, 0x0290U, 0x0043U )] public void ConfiguresWindowsInputModes( TerminalInputMode inputMode, uint requiredBits, @@ -192,7 +192,7 @@ uint clearedBits const uint unrelated = 0x80000000U; TerminalModeSnapshot baseline = TerminalModeSnapshot.CreateWindowsConsole( TerminalConsoleDirection.Input, - unrelated | 0x0007U + unrelated | 0x0047U ); TerminalModeSnapshot configured = TerminalInputModePolicy.Configure( diff --git a/tests/Icod.Terminal.Tests/src/Control/WindowsConsoleOutputCodePageTests.cs b/tests/Icod.Terminal.Tests/src/Control/WindowsConsoleOutputCodePageTests.cs new file mode 100644 index 000000000..4bf506f19 --- /dev/null +++ b/tests/Icod.Terminal.Tests/src/Control/WindowsConsoleOutputCodePageTests.cs @@ -0,0 +1,108 @@ +/* + Icod.Terminal.Tests + Automated test suite for the Icod.Terminal library. + Copyright (C) 2026 Timothy J. Bruce +*/ + +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +namespace Icod.Terminal.Tests.Control; + +using System.Reflection; +using Icod.Terminal; +using Xunit; + +/// +/// Verifies reversible UTF-8 ownership for byte-oriented Windows console output. +/// +public sealed class WindowsConsoleOutputCodePageTests { + private const uint Utf8CodePage = 65001U; + + [Fact] + public void AcquiresUtf8AndRestoresTheExactBaselineOnce() { + uint current = 437U; + List writes = []; + IDisposable? lease = InvokeTryEnableUtf8( + () => current, + value => { + writes.Add( value ); + current = value; + return true; + } + ); + + Assert.NotNull( lease ); + Assert.Equal( Utf8CodePage, current ); + Assert.Equal( [ Utf8CodePage ], writes ); + + lease.Dispose(); + + Assert.Equal( 437U, current ); + Assert.Equal( [ Utf8CodePage, 437U ], writes ); + + lease.Dispose(); + + Assert.Equal( [ Utf8CodePage, 437U ], writes ); + } + + [Fact] + public void LeavesAnExistingUtf8BaselineUntouched() { + List writes = []; + IDisposable? lease = InvokeTryEnableUtf8( + () => Utf8CodePage, + value => { + writes.Add( value ); + return true; + } + ); + + Assert.NotNull( lease ); + lease.Dispose(); + Assert.Empty( writes ); + } + + [Fact] + public void ReportsUnavailableWhenUtf8CannotBeEnabled() { + IDisposable? lease = InvokeTryEnableUtf8( + () => 437U, + _ => false + ); + + Assert.Null( lease ); + } + + private static IDisposable? InvokeTryEnableUtf8( + Func getOutputCodePage, + Func setOutputCodePage + ) { + Type? owner = typeof( TerminalSession ).Assembly.GetType( + "Icod.Terminal.WindowsConsoleOutputCodePage", + throwOnError: false + ); + Assert.NotNull( owner ); + MethodInfo? method = owner.GetMethod( + "TryEnableUtf8", + BindingFlags.Static | BindingFlags.NonPublic, + binder: null, + types: [ typeof( Func ), typeof( Func ) ], + modifiers: null + ); + Assert.NotNull( method ); + return (IDisposable?)method.Invoke( + null, + [ getOutputCodePage, setOutputCodePage ] + ); + } +} diff --git a/tests/Icod.Terminal.Tests/src/Packaging/StableReleaseIdentityTests.cs b/tests/Icod.Terminal.Tests/src/Packaging/StableReleaseIdentityTests.cs index d7221bbad..50c2d1654 100644 --- a/tests/Icod.Terminal.Tests/src/Packaging/StableReleaseIdentityTests.cs +++ b/tests/Icod.Terminal.Tests/src/Packaging/StableReleaseIdentityTests.cs @@ -28,7 +28,7 @@ namespace Icod.Terminal.Tests.Packaging; /// public sealed class StableReleaseIdentityTests { [Fact] - public void MainDistributionPinsOneTwentyNinePatchOneStableIdentity() { + public void MainDistributionPinsOneTwentyNinePatchTwoStableIdentity() { string root = FindRepositoryRoot(); XDocument properties = XDocument.Load( Path.Combine( root, "Directory.Build.props" ) @@ -51,45 +51,47 @@ public void MainDistributionPinsOneTwentyNinePatchOneStableIdentity() { Path.Combine( root, "CHANGELOG.md" ) ); string releaseNotes = File.ReadAllText( - Path.Combine( root, "docs", "releases", "1.29.1.md" ) + Path.Combine( root, "docs", "releases", "1.29.2.md" ) ); - Assert.Equal( "1.29.1", versionPrefix ); + Assert.Equal( "1.29.2", versionPrefix ); Assert.True( null == versionSuffix || String.IsNullOrWhiteSpace( versionSuffix.Value ) ); Assert.Contains( - "EXPECTED_VERSION: 1.29.1", + "EXPECTED_VERSION: 1.29.2", workflow, StringComparison.Ordinal ); Assert.Contains( - "Stable release: **1.29.1**.", + "Stable release: **1.29.2**.", readme, StringComparison.Ordinal ); Assert.Contains( - "dotnet add package Icod.Terminal --version 1.29.1", + "dotnet add package Icod.Terminal --version 1.29.2", readme, StringComparison.Ordinal ); Assert.Contains( - "https://github.com/uniblab/Icod.Terminal/blob/main/docs/releases/1.29.1.md", + "https://github.com/uniblab/Icod.Terminal/blob/main/docs/releases/1.29.2.md", readme, StringComparison.Ordinal ); Assert.Contains( - "## 1.29.1", + "## 1.29.2", changelog, StringComparison.Ordinal ); Assert.True( File.Exists( - Path.Combine( root, "docs", "releases", "1.29.1.md" ) + Path.Combine( root, "docs", "releases", "1.29.2.md" ) ) ); foreach ( string requiredReleaseNoteText in new[] { + "UTF-8", + "mouse", "net8.0", "net9.0", "net10.0", diff --git a/tests/Icod.Terminal.WindowsInput.Smoke/Program.cs b/tests/Icod.Terminal.WindowsInput.Smoke/Program.cs index fc0b4fdd4..758028ac9 100644 --- a/tests/Icod.Terminal.WindowsInput.Smoke/Program.cs +++ b/tests/Icod.Terminal.WindowsInput.Smoke/Program.cs @@ -31,12 +31,26 @@ You should have received a copy of the GNU General Public License Check( Native.AllocConsole(), "AllocConsole" ); using SafeFileHandle handle = Native.CreateFile( "CONIN$", 0xc0000000, 3, 0, 3, 0, 0 ); Check( !handle.IsInvalid, "CONIN$" ); +using SafeFileHandle outputHandle = Native.CreateFile( "CONOUT$", 0xc0000000, 3, 0, 3, 0, 0 ); +Check( !outputHandle.IsInvalid, "CONOUT$" ); Check( Native.SetStdHandle( -10, handle.DangerousGetHandle() ), "SetStdHandle" ); +Check( Native.SetStdHandle( -11, outputHandle.DangerousGetHandle() ), "SetStdHandle" ); +Check( Native.GetConsoleMode( handle, out uint originalInputMode ), "GetConsoleMode" ); +Check( Native.SetConsoleOutputCP( 437U ), "SetConsoleOutputCP" ); using CancellationTokenSource deadline = new( TimeSpan.FromSeconds( 20 ) ); await using ( TerminalSession session = await TerminalSession.OpenAsync( new TerminalSessionOptions { - InputMode = TerminalInputMode.Raw, EchoInput = false, RequireInteractiveOutput = false, - ConfigureOutput = false, ObserveLifecycleEvents = false, TerminalOverride = TerminalProfiles.Xterm + InputMode = TerminalInputMode.Raw, EchoInput = false, + ObserveLifecycleEvents = false, TerminalOverride = TerminalProfiles.Xterm }, deadline.Token ) ) { + if ( 65001U != Native.GetConsoleOutputCP() ) throw new InvalidOperationException( "Windows console output was not configured for UTF-8." ); + Check( Native.GetConsoleMode( handle, out uint inputMode ), "GetConsoleMode" ); + if ( 0x0290U != ( inputMode & 0x0290U ) || 0U != ( inputMode & 0x0040U ) ) throw new InvalidOperationException( "Raw mode did not own VT and mouse input while suppressing Quick Edit." ); + Check( Native.GetConsoleScreenBufferInfo( outputHandle, out Native.ScreenBufferInfo screen ), "GetConsoleScreenBufferInfo" ); + await session.WriteTextAsync( "─", deadline.Token ); + await session.Output.FlushAsync( deadline.Token ); + char[] cell = new char[ 1 ]; + Check( Native.ReadConsoleOutputCharacter( outputHandle, cell, 1, screen.CursorPosition, out uint cellsRead ) && 1U == cellsRead, "ReadConsoleOutputCharacter" ); + if ( '─' != cell[ 0 ] ) throw new InvalidOperationException( "UTF-8 box drawing did not occupy the expected Windows console cell." ); Send( '\u0003', 0x43, 8 ); Send( '\u001a', 0x5a, 8 ); Send( 'x', 0x58 ); Send( '\u001b', 0x1b ); Send( 'f', 0x46 ); Send( '界', 0 ); TerminalInputEvent copy = await Read( session, deadline.Token ); if ( copy.Kind != TerminalInputEventKind.Key || copy.Character != new Rune( 'C' ) || copy.Modifiers != TerminalKeyModifiers.Control ) throw new InvalidOperationException( "Ctrl+C was not a control key." ); @@ -50,6 +64,9 @@ You should have received a copy of the GNU General Public License using CancellationTokenSource cancel = new( TimeSpan.FromMilliseconds( 100 ) ); if ( ( await session.ReadEventAsync( cancel.Token ) ).Kind != TerminalEventKind.Cancelled ) throw new InvalidOperationException( "Expected canceled wait." ); } +if ( 437U != Native.GetConsoleOutputCP() ) throw new InvalidOperationException( "Windows console output code page was not restored." ); +Check( Native.GetConsoleMode( handle, out uint restoredInputMode ), "GetConsoleMode" ); +if ( originalInputMode != restoredInputMode ) throw new InvalidOperationException( "Windows console input mode was not restored exactly." ); return 0; void Send( char value, ushort key, uint modifiers = 0 ) { @@ -60,6 +77,29 @@ void Send( char value, ushort key, uint modifiers = 0 ) { static void Check( bool result, string operation ) { if ( !result ) throw new Win32Exception( Marshal.GetLastPInvokeError(), operation ); } internal static class Native { + [StructLayout( LayoutKind.Sequential )] + internal struct Coordinate { + internal short X; + internal short Y; + } + + [StructLayout( LayoutKind.Sequential )] + internal struct SmallRectangle { + internal short Left; + internal short Top; + internal short Right; + internal short Bottom; + } + + [StructLayout( LayoutKind.Sequential )] + internal struct ScreenBufferInfo { + internal Coordinate Size; + internal Coordinate CursorPosition; + internal ushort Attributes; + internal SmallRectangle Window; + internal Coordinate MaximumWindowSize; + } + [StructLayout( LayoutKind.Explicit, Size = 20, CharSet = CharSet.Unicode )] internal struct InputRecord { [FieldOffset( 0 )] public ushort EventType; @@ -74,6 +114,11 @@ internal struct InputRecord { [DllImport( "kernel32.dll", SetLastError = true )] [return: MarshalAs( UnmanagedType.Bool )] internal static extern bool FreeConsole(); [DllImport( "kernel32.dll", SetLastError = true )] [return: MarshalAs( UnmanagedType.Bool )] internal static extern bool SetStdHandle( int kind, nint handle ); [DllImport( "kernel32.dll", EntryPoint = "CreateFileW", CharSet = CharSet.Unicode, SetLastError = true )] internal static extern SafeFileHandle CreateFile( string name, uint access, uint share, nint security, uint creation, uint flags, nint template ); + [DllImport( "kernel32.dll", SetLastError = true )] [return: MarshalAs( UnmanagedType.Bool )] internal static extern bool GetConsoleMode( SafeFileHandle handle, out uint mode ); + [DllImport( "kernel32.dll", SetLastError = true )] internal static extern uint GetConsoleOutputCP(); + [DllImport( "kernel32.dll", SetLastError = true )] [return: MarshalAs( UnmanagedType.Bool )] internal static extern bool SetConsoleOutputCP( uint codePage ); + [DllImport( "kernel32.dll", SetLastError = true )] [return: MarshalAs( UnmanagedType.Bool )] internal static extern bool GetConsoleScreenBufferInfo( SafeFileHandle handle, out ScreenBufferInfo info ); + [DllImport( "kernel32.dll", EntryPoint = "ReadConsoleOutputCharacterW", CharSet = CharSet.Unicode, SetLastError = true )] [return: MarshalAs( UnmanagedType.Bool )] internal static extern bool ReadConsoleOutputCharacter( SafeFileHandle handle, [Out] char[] buffer, uint length, Coordinate coordinate, out uint read ); [DllImport( "kernel32.dll", EntryPoint = "WriteConsoleInputW", SetLastError = true )] [return: MarshalAs( UnmanagedType.Bool )] internal static extern bool WriteConsoleInput( SafeFileHandle handle, InputRecord[] records, uint count, out uint written ); #pragma warning restore SYSLIB1054 }