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
39 changes: 39 additions & 0 deletions .claude/skills/ci-gates/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -10744,3 +10744,42 @@ before committing** -- with the simulator on `PATH` (passes) and with it removed
(prints `iverilog is not on PATH; skipping the runtime leg (nothing is claimed)`
and passes). Running the test binary directly under a stripped `PATH` costs one
command and is the only thing that could have caught this.
## 427. The backtick rule is about the SHELL, not about heredocs

Section 418 says: quote the heredoc delimiter whenever the body contains a
backtick. That is true and it is too narrow, which this pass proved by walking
through the other door.

The commit message for `tri vsim funnel` went in as `git commit -m "..."` with
the prose inline. Double quotes do not stop command substitution, so

```
* `silent` is its own row.
```

became

```
* is its own row.
```

and zsh printed `command not found: silent` -- the only reason it was noticed.
The escaped spans I had bothered to write as ``\` `` survived; the one I had not
did not. **Third occurrence of this class in this repository's log**, and by its
own rule a third instance is evidence the cure was wrong rather than another
case: 418 named the heredoc, and the class is *any shell-interpolating context*.

The cure that has no judgement in it: **prose containing a backtick never
reaches the shell as an argument.** Write it to a file, or pipe it through a
QUOTED heredoc, and let git read it:

```
git commit -F - <<'MSG'
… prose with `backticks` …
MSG
```

The damage here is unrepairable in place: the commit is pushed and this
repository forbids force-pushing, so the message stands with a hole in it and
the correction lives in a later commit and in the pull request body. That is the
second cost of the trap and the reason to close the class rather than the case.
10 changes: 10 additions & 0 deletions cli/tri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ mod seals;
mod sweep;
mod types_dup;
mod vectors;
mod vsim;
mod synth;

#[derive(Parser)]
Expand Down Expand Up @@ -253,6 +254,14 @@ enum Commands {
#[command(subcommand)]
action: unparsed::UnparsedCmd,
},
/// How far each spec gets when its generated Verilog is actually RUN.
///
/// The one arm that can catch a defect whose nature is that it compiles,
/// and the one arm whose gate has had no targets since #2283 -- see #2987.
Vsim {
#[command(subcommand)]
action: vsim::VsimCmd,
},
/// What `.trinity/seals` says about a spec, when it says it twice.
Seals {
#[command(subcommand)]
Expand Down Expand Up @@ -908,6 +917,7 @@ fn main() -> Result<()> {
Commands::Competitors { action } => competitors::run(action)?,
Commands::Issues { action } => issues::run(action)?,
Commands::Unparsed { action } => unparsed::run(action, std::env::current_dir()?)?,
Commands::Vsim { action } => vsim::run(action)?,
Commands::Seals { action } => seals::run(action)?,
Commands::Hooks { action } => hooks::run(action)?,
}
Expand Down
Loading
Loading