schema_id: sinji.termwright.walkthrough.v1
schema_version: "1"
walkthrough_id: prewrite_rust_reject_dbg
description: "`.rs` write triggers fs-write-pre and is rejected on `dbg!()`."
defaults:
  pty:
    cols: 120
    rows: 40
  timeouts:
    default_timeout_ms: 60000
  sandbox:
    files:
      - rel_path: musha_home/auth.json
        contents: |
          {
            "tokens": {
              "id_token": "eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20iLCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9wbGFuX3R5cGUiOiJwcm8iLCJjaGF0Z3B0X2FjY291bnRfaWQiOiJhY2NvdW50X2lkIn19.sig",
              "access_token": "sinji_dummy_access_token",
              "refresh_token": "sinji_dummy_refresh_token",
              "account_id": "account_id"
            },
            "last_refresh_utc_ms": 32503680000000
          }
      - rel_path: musha_home/config.toml
        contents: |
          disable_paste_burst = true
          approval_policy = "untrusted"

          [notice]
          hide_full_access_warning = true

          [tui]
          show_tooltips = false
          alternate_screen = "never"

normalization:
  scrubbers:
    - kind: replace_regex
      pattern: '(?s)\.tsqoba/musha/sandboxes/.*?/workspace/'
      replacement: '.tsqoba/musha/sandboxes/<SANDBOX>/workspace/'
      notes: scrub sandbox workspace rel paths
    - kind: replace_regex
      pattern: '\(v\d+\.\d+\.\d+\)'
      replacement: '(v<VERSION>)'
      notes: scrub CLI version
    - kind: replace_regex
      pattern: '\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b'
      replacement: '<UUID>'
      notes: scrub UUIDs
    - kind: replace_regex
      pattern: '› (Explain this codebase|Summarize recent commits|Implement \{feature\}|Find and fix a bug in @filename|Write tests for @filename|Improve documentation in @filename)'
      replacement: '› <PLACEHOLDER>'
      notes: scrub random composer placeholder
    - kind: replace_regex
      pattern: '(?m)^\s*.*\bOUT\b.*\bCTX\b.*$'
      replacement: '  <FOOTER_LINE>'
      notes: scrub footer line chrome
    - kind: replace_regex
      pattern: '(?m)^.*Working \(.*\n?'
      replacement: ''
      notes: drop transient working line
    - kind: replace_regex
      pattern: '\n{3,}'
      replacement: "\n\n"
      notes: collapse large blank gaps
    - kind: replace_regex
      pattern: '\b\d{2}:\d{2}:\d{2}\b'
      replacement: '<TIME>'
      notes: scrub wallclock time
    - kind: replace_regex
      pattern: '\(\+\d+s\)'
      replacement: '(+<DUR>)'
      notes: scrub elapsed seconds
    - kind: replace_regex
      pattern: 'Worked for \d+s'
      replacement: 'Worked for <DUR>'
      notes: scrub worked-for duration
    - kind: replace_regex
      pattern: 'Working \(\d+s'
      replacement: 'Working (<DUR>'
      notes: scrub working duration
    - kind: replace_regex
      pattern: '[•◦] Hook: ([^\\n]+) \(\d+s • esc to interrupt\)'
      replacement: '• Hook: $1 (<DUR> • esc to interrupt)'
      notes: scrub hook duration
steps:
  - action_id: sinji.api.serve.start
    payload:
      cassette_path: cassette.yaml

  - action_id: termwright.session.open
    payload:
      argv:
        - /workspace/bin/tsqoba/current/tsqoba
        - musha
        - --project-root
        - "<SANDBOX_WORKSPACE>"
      cwd: "<SANDBOX_WORKSPACE>"

  - action_id: termwright.wait_for
    payload:
      kind: digest_changes
      min_changes: 1

  - action_id: termwright.input.send
    payload:
      text: "Create prewrite_dbg.rs containing dbg!(1)\r"

  - action_id: termwright.wait_for
    payload:
      kind: contains
      text: "prewrite_dbg.rs (+3 -0)"

  - action_id: termwright.snapshot.save
    payload:
      name: 01_tool_call.yaml

  - action_id: termwright.wait_for
    payload:
      kind: contains
      text: "RUST-ANTI-DBG-001"

  - action_id: termwright.wait_for
    payload:
      kind: contains
      text: "structured findings / diagnostics / tracing at adapters only."

  - action_id: termwright.snapshot.save
    payload:
      name: 02_rejected.yaml

  - action_id: termwright.input.send
    payload:
      text: "!test -f prewrite_dbg.rs && echo EXISTS || echo MISSING\r"

  - action_id: termwright.wait_for
    payload:
      kind: contains
      text: "MISSING"

  - action_id: termwright.input.send
    payload:
      text: "/quit\r"

  - action_id: termwright.wait_for
    payload:
      kind: process_exit
      expected_exit_code: 0

  - action_id: sinji.api.serve.stop
