Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: CHG-0064-honour-the-modes-and-charsets-that-decide-what-the-screen-contains-and-strip-th
state: accepted
state: archived
type: feature
base_commit: cc8bb3c25e807fe07de3cf66687302d97f1ddddb
---
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"schema_version": 1,
"id": "CHG-0064-honour-the-modes-and-charsets-that-decide-what-the-screen-contains-and-strip-th",
"slug": "honour-the-modes-and-charsets-that-decide-what-the-screen-contains-and-strip-th",
"title": "Honour the modes and charsets that decide what the screen contains, and strip the escapes the sanitizer missed",
"description": "Honour the modes and charsets that decide what the screen contains, and strip the escapes the sanitizer missed",
"kind": "feature",
"state": "archived",
"canonical_applied": true,
"base_commit": "cc8bb3c25e807fe07de3cf66687302d97f1ddddb",
"created_at": 1787006901,
"updated_at": 1787032773,
"affected_specs": [
"parsers"
],
"affected_paths": [
"lib/rune/parsers/screen.rb",
"lib/rune/parsers/screen_renderer.rb",
"lib/rune/parsers/text_sanitizer.rb",
"spec/rune/parsers/screen_renderer_spec.rb",
"spec/rune/parsers/text_sanitizer_spec.rb",
"specs/parsers/parsers.spec.md",
"harnesses/renderer_gaps.rb",
".specsync/change-sequence.json"
],
"no_spec_change": false,
"no_spec_change_rationale": null,
"acceptance_criteria": [
"The renderer honours the alternate screen buffer (1049, 1047, 47), DECAWM, IRM and DEC Special Graphics charset designation with SO/SI, and TextSanitizer strips the two-byte escapes and the full charset-designation set. Four of the five renderer gaps ROADMAP listed as open are closed; double-width characters remain, recorded as a limitation with its measurement. Every fix is verified by a harness that measures against ECMA-48/xterm behaviour rather than a reference emulator, and every new test was falsified against deliberately unfixed code."
],
"selected_artifacts": [
"context",
"requirements",
"plan",
"tasks",
"testing",
"docs"
],
"dependencies": [],
"answers": {
"architecture_risk": "no",
"public_contract": "yes"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: CHG-0065-record-that-the-wide-character-cell-model-was-built-and-measured-worse-than-the
state: accepted
state: archived
type: feature
base_commit: 1749093b9563a42e245ceeb6d6f7eb59fb23fb63
---
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"schema_version": 1,
"id": "CHG-0065-record-that-the-wide-character-cell-model-was-built-and-measured-worse-than-the",
"slug": "record-that-the-wide-character-cell-model-was-built-and-measured-worse-than-the",
"title": "Record that the wide-character cell model was built and measured worse than the gap",
"description": "Record that the wide-character cell model was built and measured worse than the gap",
"kind": "feature",
"state": "archived",
"canonical_applied": true,
"base_commit": "1749093b9563a42e245ceeb6d6f7eb59fb23fb63",
"created_at": 1787009342,
"updated_at": 1787032785,
"affected_specs": [
"parsers"
],
"affected_paths": [
"specs/parsers/parsers.spec.md",
"harnesses/renderer_gaps.rb",
".specsync/change-sequence.json"
],
"no_spec_change": false,
"no_spec_change_rationale": null,
"acceptance_criteria": [
"parsers.spec.md invariant 17 records that a wide-character cell model was implemented and reverted, with the live-output comparison that killed it and the two synthetic probes that reproduce it. The claim is limited to the cases that actually differ; a probe identical in both is labelled baseline rather than evidence. harnesses/renderer_gaps.rb carries the reproduction and says which cases the cell model changed. No production behaviour changes."
],
"selected_artifacts": [
"context",
"requirements",
"plan",
"tasks",
"testing",
"docs"
],
"dependencies": [],
"answers": {
"architecture_risk": "no",
"public_contract": "no"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: CHG-0066-stop-a-read-mid-escape-withhold-an-unterminated-sequence-from-the-text-and-the
state: accepted
state: archived
type: feature
base_commit: 4abd95c8461be099fc5030a740ea456ec7d242d1
---
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"schema_version": 1,
"id": "CHG-0066-stop-a-read-mid-escape-withhold-an-unterminated-sequence-from-the-text-and-the",
"slug": "stop-a-read-mid-escape-withhold-an-unterminated-sequence-from-the-text-and-the",
"title": "Stop a read mid-escape: withhold an unterminated sequence from the text and the cursor",
"description": "Stop a read mid-escape: withhold an unterminated sequence from the text and the cursor",
"kind": "feature",
"state": "archived",
"canonical_applied": true,
"base_commit": "4abd95c8461be099fc5030a740ea456ec7d242d1",
"created_at": 1787015317,
"updated_at": 1787032795,
"affected_specs": [
"session",
"pty_runner"
],
"affected_paths": [
"lib/rune/commands/session_command.rb",
"lib/rune/output_limiter.rb",
"spec/rune/session_spec.rb",
"specs/session/session.spec.md",
"specs/pty_runner/pty_runner.spec.md",
".specsync/change-sequence.json"
],
"no_spec_change": false,
"no_spec_change_rationale": null,
"acceptance_criteria": [
"A read stops at the last complete escape sequence and its cursor stops there too, so a sequence split across two pty reads is never delivered as visible text and never left headless for the next read. list's last_line is summarised from the reassembled tail rather than one event. Verified on the exact reported reproduction: clean_output, screen and last_line all agree the child printed RED, where previously clean_output said 1mRED and screen said RED in the same reply. Three regression tests, each falsified against deliberately unfixed code."
],
"selected_artifacts": [
"context",
"requirements",
"plan",
"tasks",
"testing",
"docs"
],
"dependencies": [],
"answers": {
"architecture_risk": "no",
"public_contract": "yes"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: CHG-0067-make-tail-count-a-carriage-return-as-a-line-break-and-report-matched-on-a-reg
state: accepted
state: archived
type: feature
base_commit: 8c9055be7093551caf654679a1f8ebb51357de50
---
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"schema_version": 1,
"id": "CHG-0067-make-tail-count-a-carriage-return-as-a-line-break-and-report-matched-on-a-reg",
"slug": "make-tail-count-a-carriage-return-as-a-line-break-and-report-matched-on-a-reg",
"title": "Make --tail count a carriage return as a line break, and report matched on a regex send's timeout",
"description": "Make --tail count a carriage return as a line break, and report matched on a regex send's timeout",
"kind": "feature",
"state": "archived",
"canonical_applied": true,
"base_commit": "8c9055be7093551caf654679a1f8ebb51357de50",
"created_at": 1787020810,
"updated_at": 1787032803,
"affected_specs": [
"session",
"pty_runner"
],
"affected_paths": [
"lib/rune/output_limiter.rb",
"lib/rune/session/pending_send.rb",
"lib/rune/commands/session_command.rb",
"spec/rune/session_spec.rb",
"specs/session/session.spec.md",
"docs/sessions.md",
".specsync/change-sequence.json"
],
"no_spec_change": false,
"no_spec_change_rationale": null,
"acceptance_criteria": [
"The tail bound counts CR, LF and CRLF as line breaks, so it bounds a full-screen TUI's repaint output instead of silently returning everything with truncated and omitted_lines absent. rune run bounds raw_output as well as clean_output, which it did not when the raw stream had no LFs. A regex send reports matched false when it times out, as its own comment always claimed. The documentation saying a regex send races the settle window is corrected in the spec, in docs/sessions.md and in help, and settled is defined as the wait being answered rather than the child going quiet. Four regression tests, each falsified against deliberately unfixed code."
],
"selected_artifacts": [
"context",
"requirements",
"plan",
"tasks",
"testing",
"docs"
],
"dependencies": [],
"answers": {
"architecture_risk": "no",
"public_contract": "yes"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: CHG-0068-correct-the-flag-message-run-gets-wrong-and-the-five-contracts-the-dogfood-foun
state: accepted
state: archived
type: feature
base_commit: 023f4078ec28548d58aaa35bfd985e5a843781e9
---
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"schema_version": 1,
"id": "CHG-0068-correct-the-flag-message-run-gets-wrong-and-the-five-contracts-the-dogfood-foun",
"slug": "correct-the-flag-message-run-gets-wrong-and-the-five-contracts-the-dogfood-foun",
"title": "Correct the flag message run gets wrong, and the five contracts the dogfood found documented wrong",
"description": "Correct the flag message run gets wrong, and the five contracts the dogfood found documented wrong",
"kind": "feature",
"state": "archived",
"canonical_applied": true,
"base_commit": "023f4078ec28548d58aaa35bfd985e5a843781e9",
"created_at": 1787029711,
"updated_at": 1787032810,
"affected_specs": [
"pty_runner",
"session"
],
"affected_paths": [
"lib/rune/commands/run_command.rb",
"lib/rune/commands/session_command.rb",
"lib/rune/output_limiter.rb",
"spec/rune/commands/run_command_spec.rb",
"specs/pty_runner/pty_runner.spec.md",
"specs/session/session.spec.md",
"docs/sessions.md",
"docs/getting_started.md",
"docs/pty_architecture.md",
"ROADMAP.md",
".specsync/change-sequence.json"
],
"no_spec_change": false,
"no_spec_change_rationale": null,
"acceptance_criteria": [
"A flag rune run owns, spelled correctly but given a space-separated value, gets a message naming the real problem instead of Unknown option plus a remedy that hands the flag to the child. The known-flag set is derived from the parser so it cannot drift. Four further findings are confirmed as documentation defects and corrected where each is stated: the two run output fields describe different windows under max-output, omitted_bytes reconciles only on ASCII, grep matches the cleaned transcript rather than the rendered screen, and screen is bounded by geometry rather than by the read filters. Every code path keeps its current behaviour except the one message."
],
"selected_artifacts": [
"context",
"requirements",
"plan",
"tasks",
"testing",
"docs"
],
"dependencies": [],
"answers": {
"architecture_risk": "no",
"public_contract": "yes"
}
}
4 changes: 2 additions & 2 deletions .specsync/change-sequence.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schema_version": 1,
"sequence": 68,
"id": "CHG-0068-correct-the-flag-message-run-gets-wrong-and-the-five-contracts-the-dogfood-foun",
"sequence": 69,
"id": "CHG-0069-guard-the-flags-watch-was-executing-and-bound-the-two-fields-max-output-was-not",
"acknowledged_collisions": []
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"approvals": [
{
"gate": "definition",
"actor": "0xLeif",
"timestamp": 1787038084,
"digest": "4c75a772348974c4e7436b1c62048c69df496e193c04980909b93f0cbd30bfe8",
"note": null
},
{
"gate": "definition",
"actor": "0xLeif",
"timestamp": 1787038105,
"digest": "33e699eb9baeed95ea42d9f3f590c6fe5b311af1ccb06cb4d932b44e146830a8",
"note": null
},
{
"gate": "definition",
"actor": "0xLeif",
"timestamp": 1787038144,
"digest": "c94fbf53c54c9849203f069b3e27b5099737b803485ac25b9c52c7cf94b74ff7",
"note": null
},
{
"gate": "acceptance",
"actor": "claude",
"timestamp": 1787038297,
"digest": "351fbb5c5a60597a54463c7905c1ac128cd4751a189c81949945d300897a4f65",
"note": null
}
],
"reopenings": []
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
id: CHG-0069-guard-the-flags-watch-was-executing-and-bound-the-two-fields-max-output-was-not
state: accepted
type: feature
base_commit: ad76e2237bb8215f77d4cd7bb8358cc6083a61f2
---

# Guard the flags watch was executing, and bound the two fields max-output was not

## Intent

Guard the flags watch was executing, and bound the two fields max-output was not

## Affected Canonical Specs

- `watch`
- `pty_runner`
- `session`
- `cli`

## Acceptance Criteria

- rune watch refuses a flag-shaped token it does not own instead of executing it as the command, sharing run's guard rather than copying it. rune session read honours --since when --grep is given, searching the slice rather than the whole transcript. max-output and tail bound clean_stdout and clean_stderr as well as the merged fields. Each fix has tests that fail against deliberately reverted code, including a drift guard for watch's flag list. Export documentation follows the two constants and one method that moved from RunCommand to Command.

## No-spec Rationale

Not applicable
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
change: CHG-0069-guard-the-flags-watch-was-executing-and-bound-the-two-fields-max-output-was-not
artifact: context
---

# Context

Three defects that surfaced during the triage of the translation dogfood but were
out of that PR`s scope. Each was verified here before being planned.

**watch executed the flags it did not recognise.** Anything flag-shaped stayed in
the argv and became the command. My first probe of this was worthless: a non-tty
run refuses on "stdin is not a TTY" before parsing anything, so the refusal was
the TTY check and proved nothing. Driven through a real `PTY.spawn`,
`rune watch --timeout 5 -- echo hi` exited **127 with the child never running**.
`run` has guarded this since it grew flags. watch never did, which made it the
worse of the two — run at least says something.

**`--grep` ignored `--since`.** `filter` was handed the sliced text and then
called `transcript.grep`, which searched `@text`. Measured: a read from a cursor
recorded after the first line still returned that line, and `grep_matches`
counted it.

**`--max-output` did not bound the separate streams.** A 200-byte budget returned
10,506 bytes across four fields, because only the merged pair went through
`apply_output_limit`.
Loading
Loading