Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
157 commits
Select commit Hold shift + click to select a range
7d38cd5
feat: add vpto backend
Apr 12, 2026
467385c
clarify block query docs and trim conversion section
WenboCodes Apr 10, 2026
cb4aca1
docs(isa): clarify get_buf/rls_buf usage and mode parameter
Apr 11, 2026
4bb4af3
fix: correct event ID explanation in comparison table
Apr 11, 2026
233286c
fix: clarify event ID management in comparison table
Apr 11, 2026
9809add
fix: simplify event ID explanation and drain example
Apr 11, 2026
e292a9d
fix: correct set_flag/wait_flag count in quick example
Apr 11, 2026
9370670
fix: add concrete 1:N example for loop peeling comparison
Apr 11, 2026
680880c
fix: show get_buf/rls_buf inside scf loop for 1:N example
Apr 11, 2026
9ed0755
refactor vpto llvm emiter
Apr 11, 2026
f2f1de7
add online softmax (q * k is ready) case
Apr 12, 2026
3db0122
docs: add VPTO spec v0.3 release draft
WenboCodes Apr 12, 2026
a8e07bb
add PTO-Gym submodule
Apr 12, 2026
9331d12
feat: add PTO-Gym guide skill
Apr 12, 2026
6cb0ba5
Add tilelang dsl implementation
Zhendong404 Apr 3, 2026
eeecb3f
Update openspec
Zhendong404 Apr 3, 2026
311581a
Support more syntax in tilelang dsl
Zhendong404 Apr 3, 2026
dec07d0
Update openspec
Zhendong404 Apr 3, 2026
871dd30
tilelang dsl first working version
Zhendong404 Apr 4, 2026
1ce8c9a
Update openspec
Zhendong404 Apr 4, 2026
f293c6f
Support more dsl syntax
Zhendong404 Apr 7, 2026
33e54c4
Amend
Zhendong404 Apr 7, 2026
06dba38
Update docs
Zhendong404 Apr 7, 2026
183c268
docs: add TileOp expand design and demo
Apr 7, 2026
e986589
feat(transforms): add Tile→Vector template lowering pipeline
Apr 7, 2026
d6ee030
brough back the lost pass and pto op after rebase
Apr 12, 2026
6469841
feat: tile lang dsl
Zhendong404 Apr 7, 2026
5e7a754
Update DSL user guide
Zhendong404 Apr 11, 2026
0cb052a
Support more tile attributes
Zhendong404 Apr 11, 2026
662ab43
Support more event IDs
Zhendong404 Apr 11, 2026
1696ffc
Align copy_ubuf_to_ubuf
Zhendong404 Apr 11, 2026
3c62cc2
Support more load/store ops
Zhendong404 Apr 11, 2026
63f3ce8
Support colmajor indexing syntax
Zhendong404 Apr 11, 2026
d9d301a
Enhance Tile indexing syntax documentation to clarify restrictions on…
Zhendong404 Apr 11, 2026
d848986
Update openspec
Zhendong404 Apr 11, 2026
0f3e426
Support more predicate ops
Zhendong404 Apr 11, 2026
39b9390
Support keyword arguments for vdup and vci operations in TileLang DSL
Zhendong404 Apr 11, 2026
947db87
Support more dma operations
Zhendong404 Apr 13, 2026
a0725fc
Align DSL interface with VPTO v0.3
Zhendong404 Apr 13, 2026
3057bc7
Add more memory op support
Zhendong404 Apr 13, 2026
7af8752
Fix failed lit case
Zhendong404 Apr 13, 2026
1fe9922
Dump source location for DSL frontend errors
Zhendong404 Apr 13, 2026
212c996
Fix inline_proc codegen
Zhendong404 Apr 13, 2026
49098fe
Support optional RoundMode/SatMode/Part arguments in vcvt op
Zhendong404 Apr 13, 2026
cfccc5e
Fix tile attribute extraction
Zhendong404 Apr 14, 2026
0dd7451
support expand tload/tstore to tile lib in ptoas
Apr 10, 2026
96be86c
Fix TileLang ST ptoas invocation
Apr 11, 2026
b236746
Fold TileLang dead branches after intrinsic folding
Apr 11, 2026
3b134c9
Fix tilelang ST tadd simulator flow
Apr 11, 2026
b969c76
fixup ptr normalize
Apr 13, 2026
e8896dc
Refactor tilelang ST framework and document full execution flow
Apr 13, 2026
bfcb67d
Add local tilelang ST test common header
Apr 13, 2026
f4192cd
resolve confilct
Apr 14, 2026
9ae4951
update ptoas option
Apr 14, 2026
fef9e85
Support scalar mod operation in DSL
Zhendong404 Apr 14, 2026
83fefbe
Support custom tile padding value
Zhendong404 Apr 14, 2026
a422bb0
Fix missing valid_shape/padvalue info when expand tileop
Zhendong404 Apr 14, 2026
d0d4bd1
Use pad_value.eval() instead of pad_value.value
Zhendong404 Apr 14, 2026
7f121cc
Fix semantics of vdup op
Zhendong404 Apr 14, 2026
3c19023
Fix vecscope inference for inline_proc
Zhendong404 Apr 14, 2026
dcf069f
Fix tshrs/tshls scalar type legality check
Zhendong404 Apr 14, 2026
6df2511
fix(dsl): extend scalar arithmetic/bitwise lowering and tests (#71)
Zhendong404 Apr 14, 2026
227dc9a
fix(dsl): align vbitsort and vmrgsort4 with vpto (#67)
Zhendong404 Apr 14, 2026
031f356
[PTOAS] wire MLIR IR printing through ptoas pipelines
Zhendong404 Apr 14, 2026
d6ef37b
Use select_kernel for expand helper selection
Apr 14, 2026
a93f5a3
Recover static view strides in ExpandTileOp
Apr 14, 2026
1a61b54
Refine tilelang ST compare flow
Apr 14, 2026
3dd54a8
fix(tilelang-dsl): enforce vcvt attrs by type pair and align vcvt low…
Zhendong404 Apr 15, 2026
b89065b
chore: drop trowargmax template from issue #63 PR
Zhendong404 Apr 15, 2026
31720d9
fix(dsl): support module-level literal constants in kernels (#62)
Zhendong404 Apr 15, 2026
b8a8aff
feat(dsl): allow inline_proc capture of module literal globals
Zhendong404 Apr 15, 2026
fb6a511
Update dsl user guide
Zhendong404 Apr 15, 2026
a2bfc8a
tilelang-dsl: support pass as frontend no-op
Zhendong404 Apr 15, 2026
f6ac6b5
align(tilelang-dsl): support PartitionTensorView slice binding and docs
Zhendong404 Apr 15, 2026
1a692b2
udpate tload and tstore.
sundyCoder Apr 14, 2026
fdf79f0
update tload, tstore and related ST.
sundyCoder Apr 15, 2026
1be7d05
Add a skill to resolve DSL issue
Zhendong404 Apr 14, 2026
95500bf
fix(tilelang-dsl): emit stable float bit-pattern constants
Zhendong404 Apr 15, 2026
1a78260
fix(tilelang-dsl): enforce explicit pointer surface for psts
Zhendong404 Apr 15, 2026
9eafabd
fix(dsl): handle valid_shape subscript and guard unsupported tuple su…
Zhendong404 Apr 16, 2026
d7598b8
support pto.set_mov_pad_val
Apr 15, 2026
85462b6
Add VPTO membar support
Apr 14, 2026
4ccf6e6
warning the channel vsts
Apr 15, 2026
81c2cb5
update docs for channel vsts
Apr 15, 2026
1182d31
fix(dsl): support explicit set_mov_pad_val for DMA padding
Zhendong404 Apr 16, 2026
3a7410e
fix: support unsigned dtypes in ExpandTileOp
Apr 15, 2026
d23087e
fix(tilelang-dsl): keep vbitsort and vmrgsort4 out of inferred vecscope
Apr 16, 2026
d545362
feat(tilelang-dsl): add select_kernel diagnostics report
Zhendong404 Apr 16, 2026
b69c3e7
specify dist of vsts/vlds
Apr 16, 2026
7ea0939
fix(dsl): materialize vtrc round mode in tilelang
Zhendong404 Apr 16, 2026
f0f8cd3
Add tcvt TileLib support and ST coverage
Apr 16, 2026
ffc54fd
Add f16-to-f32 tcvt support
Apr 16, 2026
cb7aaf6
Add f32-to-f16 tcvt support
Apr 16, 2026
aa29519
let the dist of store op more flexiable
Apr 17, 2026
8e189b4
fix(dsl): fix vecscope inference
Zhendong404 Apr 17, 2026
c394bfb
support ctrl reg configure ops
Apr 19, 2026
4b1078f
fix: accept integer scalar operands in tmaxs and tmins memref lowering
Apr 17, 2026
e09a66a
udpate tload and tstore, and add testcase.
Apr 20, 2026
5a290e8
feat(dsl): complete predicate ops and enforce PredicateDist enum
Zhendong404 Apr 17, 2026
fb944e8
Add vbitcast implementation
Zhendong404 Apr 17, 2026
00535ba
Fix TileLang enum support for issue 131
Zhendong404 Apr 20, 2026
d32497c
Adding testing for TCI, assuring correctness
OmarZohir Apr 17, 2026
83008bf
test(tilelang_st): add self-hosted runner batch entrypoint
Zhendong404 Apr 20, 2026
1517719
fix(tilelang-dsl): emit signless arith constants for unsigned scalars…
Zhendong404 Apr 20, 2026
8d497fe
Revert "Adding testing for TCI, assuring correctness"
Zhendong404 Apr 20, 2026
5c6ad4c
fix(tilelang-dsl): support i64 vregs in DSL v1 (#151)
Zhendong404 Apr 21, 2026
9849d2e
bugfix: i8/i16 vcadd will widen the return type
Apr 20, 2026
d19e86b
bugfix: i8/i16 vcadd res type
Apr 21, 2026
0c60fa5
bugfix: update i8/i16 vcadd dsl docs
Apr 21, 2026
cfb6d53
fix(tilelang-dsl): align f16->i32 vcvt contract (#152)
Zhendong404 Apr 21, 2026
70a2c34
Support bf16->f16 convert
Zhendong404 Apr 21, 2026
849375e
Support materialize PadValue with eval(dtype) interface
Zhendong404 Apr 21, 2026
6ba227d
fix(dsl): allow PadValue.eval with static dtype bindings
Zhendong404 Apr 21, 2026
4a7c4a3
fix: align A5 expanddiv integer type verification
FangRui0 Apr 20, 2026
ede0303
fix(tilelang-dsl): auto-cast mov pad scalars for issue 170 (#170)
Zhendong404 Apr 21, 2026
a2d6654
fixup ci
Apr 21, 2026
b16e896
fix(dsl): support integer string scalar literals (#174)
Zhendong404 Apr 21, 2026
8c79f38
feat: vpto ci
Apr 21, 2026
7bee49d
feat: ignore local workspace
Apr 22, 2026
bffcbd6
feat: support tilelang dsl ci
Apr 22, 2026
50b3468
remove the fork repo pr protects
Apr 22, 2026
625e2f2
fix(vpto): normalize signed integer vector decls
Zhendong404 Apr 22, 2026
5b98ed3
[WIP] feat: new dma load/store op (#141)
mouliangyu Apr 22, 2026
004664e
Support packed vcvt part modes
Zhendong404 Apr 22, 2026
7434cb3
Support p0/p1/p2/p3 vcvt part mode
Zhendong404 Apr 22, 2026
a265244
Support the whole mem barrier types
Zhendong404 Apr 22, 2026
567a991
chore(ci): fix license headers for pr199
Zhendong404 Apr 22, 2026
4e7a2f8
fix(expand-tileop): add cmp_mode attribute handling for TCmpOp and TC…
Zhendong404 Apr 22, 2026
dff551c
feat: support dsl ut ci
Apr 22, 2026
fb1b5e8
feat(tilelang-dsl): add vscatter surface lowering
Zhendong404 Apr 22, 2026
7d5a3e4
fix(dsl): require hex strings for integer bit patterns (#174)
Zhendong404 Apr 22, 2026
07f68c5
docs: add license headers to issue 174 updates
Zhendong404 Apr 22, 2026
8ec6f1b
Add bitcast after arith.constant
Zhendong404 Apr 21, 2026
9fb93e0
fix: handle type compatibility in tryCloneOpLibInlineBridgeOp
Zhendong404 Apr 21, 2026
34d538b
fix(dsl): align vexpdif surface with VPTO
Zhendong404 Apr 22, 2026
b9ee1d3
fix: avoid false A5 tprelu vec overflow in memory planning
FangRui0 Apr 22, 2026
b2d0ec6
fix(dsl): unify type conversion logics in frontend
Zhendong404 Apr 22, 2026
f2bf1ec
fix(ptoas): make vpto backend own tile op expansion (#162)
Zhendong404 Apr 21, 2026
db0a17d
feat: support pto.pbitcast op
Apr 23, 2026
f59cbc7
fix(dsl): fix the order mode lowering of pto.vci
Zhendong404 Apr 23, 2026
f19d869
feat: support copy_ubuf_to_ubuf / dma_copy lowering
Apr 23, 2026
2f42d89
fix(vpto): align vrelu i32 support (#220)
Zhendong404 Apr 23, 2026
2f9446d
Fix DSL frontend vecscope auto inference
Zhendong404 Apr 23, 2026
0f56ce1
feat(tilelang-dsl): support constructor calls on static dtype bindings
Zhendong404 Apr 22, 2026
ca19148
fix(dsl): fix DSL frontend punpack lowering
Zhendong404 Apr 23, 2026
b9ee02c
bugfix: vbr/cmps with vreg<i8> accepts i16 as scalar operand
Apr 23, 2026
4162a88
feat: vci support si8/si16/si32/f16/f32
Apr 23, 2026
839b411
feat: remove dead code
Apr 23, 2026
f672950
feat: dsl supports for trems
Apr 23, 2026
4e79f9e
align(tilelang-dsl): require enum dist for vlds/vsts
Zhendong404 Apr 24, 2026
256b760
chore(tileops): add missing license header for tcvt template
Zhendong404 Apr 24, 2026
a74ca6a
Add a mixed Tile/VPTO online softmax kernel
Apr 23, 2026
0a603e0
Refine mixed Tile/VPTO softmax kernels and CI fixes
Apr 24, 2026
fdba496
fix(pto): avoid false A5 trowarg vec overflow (#558)
Zhendong404 Apr 23, 2026
0c0f624
Fix tcolarg verifier element width constraints
Zhendong404 Apr 23, 2026
cb278a6
feat(tileop): Add unary tileop templates (#168)
liggest Apr 24, 2026
d4ae634
Add softmax tadds mix ST testcase
Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
86 changes: 86 additions & 0 deletions .codex/skills/generate-vpto-release-doc/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
name: generate-vpto-release-doc
description: Generate or refresh `docs/release/vpto-spec-v*.md` by merging `docs/vpto-spec.md` with `docs/isa/*.md`, following the release-doc naming and layout. Use when the user asks to create or update a merged VPTO release spec, inline ISA Markdown into one release document, add TOC and version bullets, move `Quick Reference by Category` to the end, or strip update, appendix, and correspondence content from the merged release doc.
---

# Generate VPTO Release Doc

Use this skill when the task is specifically about:
- creating a new merged release document under `docs/release/`
- refreshing an existing `vpto-spec-v*.md` release doc from `docs/vpto-spec.md` and `docs/isa/*.md`
- keeping the merged release doc aligned with the naming and structure used in `docs/release/vpto-spec-v0.1.md`

## Canonical Workflow

1. Pick the target version and output path.

Default output path:

```bash
docs/release/vpto-spec-v<version>.md
```

2. Run the bundled generator script.

```bash
python3 .codex/skills/generate-vpto-release-doc/scripts/generate_release_vpto_spec.py --version 0.2
```

If you need an explicit note for the new version bullet:

```bash
python3 .codex/skills/generate-vpto-release-doc/scripts/generate_release_vpto_spec.py \
--version 0.2 \
--version-note 'Merge `docs/vpto-spec.md` with `docs/isa/*.md`; add TOC; move `Quick Reference by Category` to the end; remove update, appendix, and correspondence content'
```

3. Review the generated file before finalizing.

Check these invariants:
- exactly one `#` level title in the whole file
- `[toc]` is present near the top
- the top version bullet for the requested version was added
- `## Quick Reference by Category` is the final top-level section
- no `Updated:` / review-status boilerplate remains at the beginning
- no appendix sections remain
- no `## Correspondence Categories` section remains
- no `CCE correspondence` / builtin-mapping blocks remain

4. If the user wants extra release-note wording, patch only the version bullets or other small wording around the generated content. Prefer rerunning the script over hand-merging large sections.

## Source Mapping

Use `docs/vpto-spec.md` for:
- `Part I: Architecture Overview`
- `Part II: Notation Convention`
- `C-Style Semantics Convention`
- `Template Placeholder Conventions`
- `Instruction Groups`
- `Supported Data Types`
- `Common Patterns`
- `Quick Reference by Category`

Use `docs/isa/*.md` for:
- the inlined `Detailed ISA Group Reference`

## Merge Rules

The merged release document should:
- keep the release-doc title and version-bullet style
- preserve the `Instruction Groups` summary table
- inline `docs/isa/*.md` under `Detailed ISA Group Reference`
- convert `docs/isa/*.md` links into in-document anchors like `#isa-03-vector-load-store`
- demote the inlined ISA headings by two levels so the merged TOC stays stable
- place `Quick Reference by Category` at the end

The merged release document must remove:
- beginning-of-file update/review metadata from `docs/vpto-spec.md`
- `## Correspondence Categories`
- all `CCE correspondence` blocks and related builtin/token mapping lines
- the sentence `For detailed semantics, C-style pseudocode, and CCE mappings, see the individual group documentation files.`
- appendix sections

## Notes

- The script assumes the source headings in `docs/vpto-spec.md` keep their current names. If extraction fails, inspect the heading names there before patching the script.
- The script is deterministic and is the preferred path for regenerating large merged release docs.
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
#!/usr/bin/env python3
# Copyright (c) 2026 Huawei Technologies Co., Ltd.
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
# CANN Open Software License Agreement Version 2.0 (the "License").
# Please refer to the License for details. You may not use this file except in compliance with the License.
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE in the root of the software repository for the full text of the License.

"""Generate merged VPTO release spec from docs/vpto-spec.md and docs/isa/*.md."""

from __future__ import annotations

import argparse
import re
from pathlib import Path


ROOT = Path(__file__).resolve().parents[4]
DOCS_DIR = ROOT / "docs"
SOURCE_SPEC = DOCS_DIR / "vpto-spec.md"
ISA_DIR = DOCS_DIR / "isa"
RELEASE_DIR = DOCS_DIR / "release"

TITLE = "# PTO micro Instruction Spec \u2014 Draft (A5)"
DEFAULT_VERSION_NOTES = {
"0.1": "Doc Init",
"0.2": "Update micro Instruction latency and throughput",
"0.3": "Refresh VPTO ISA specification",
}

KEEP_SECTIONS = [
"## Part I: Architecture Overview",
"## Part II: Notation Convention",
"## Instruction Groups",
"## Supported Data Types",
"## Common Patterns",
"## Quick Reference by Category",
]

ISA_LINK_RE = re.compile(r"\[([^\]]+)\]\((?:\.\./)?(?:isa/)?([0-9]{2}-[A-Za-z0-9-]+)\.md\)")


def extract_sections(markdown: str) -> dict[str, str]:
headings = list(re.finditer(r"^## .*$", markdown, flags=re.MULTILINE))
sections: dict[str, str] = {}
for index, match in enumerate(headings):
heading = match.group(0).strip()
start = match.start()
end = headings[index + 1].start() if index + 1 < len(headings) else len(markdown)
sections[heading] = markdown[start:end].strip() + "\n"
return sections


def rewrite_isa_links(text: str) -> str:
return ISA_LINK_RE.sub(lambda m: f"[{m.group(1)}](#isa-{m.group(2).lower()})", text)


def trim_trailing_rule(text: str) -> str:
return re.sub(r"\n---\s*\Z", "\n", text.strip() + "\n").rstrip()


def strip_unwanted_lines(text: str) -> str:
lines = text.splitlines()
kept: list[str] = []
skip_correspondence = False
for line in lines:
if re.match(r"^## Correspondence Categories\b", line):
skip_correspondence = True
continue
if skip_correspondence:
if re.match(r"^## ", line):
skip_correspondence = False
else:
continue
if line.startswith("> **Status:**") or line.startswith("> **Base:**") or line.startswith("> **Additions from:**") or line.startswith("> **Updated:**"):
continue
if "For detailed semantics, C-style pseudocode, and CCE mappings" in line:
continue
if "CCE correspondence" in line or "builtin mapping" in line.lower():
continue
kept.append(line)
text = "\n".join(kept).strip() + "\n"
text = re.sub(r"\n## Appendix [A-Z]:.*\Z", "\n", text, flags=re.DOTALL)
return text


def demote_headings(text: str, levels: int = 2) -> str:
def replace(match: re.Match[str]) -> str:
hashes = match.group(1)
heading = match.group(2)
new_level = min(6, len(hashes) + levels)
return f"{'#' * new_level} {heading}"

return re.sub(r"^(#{1,6})\s+(.*)$", replace, text, flags=re.MULTILINE)


def render_version_bullets(version: str, version_note: str | None) -> str:
notes = dict(DEFAULT_VERSION_NOTES)
if version_note:
notes[version] = version_note
elif version not in notes:
notes[version] = "Release refresh"

def key_fn(item: str) -> tuple[int, ...]:
return tuple(int(part) for part in item.split("."))

lines = [f"- v{ver}: {notes[ver]}" for ver in sorted(notes, key=key_fn, reverse=True)]
return "\n".join(lines)


def build_release_doc(version: str, version_note: str | None) -> str:
source_text = strip_unwanted_lines(SOURCE_SPEC.read_text())
sections = extract_sections(source_text)

missing = [name for name in KEEP_SECTIONS if name not in sections]
if missing:
raise SystemExit(f"missing expected headings in docs/vpto-spec.md: {missing}")

content_sections = [trim_trailing_rule(rewrite_isa_links(sections[name])) for name in KEEP_SECTIONS[:-1]]

isa_blocks: list[str] = ["## Detailed ISA Group Reference"]
for isa_path in sorted(ISA_DIR.glob("*.md")):
isa_text = rewrite_isa_links(isa_path.read_text().strip() + "\n")
isa_blocks.append(trim_trailing_rule(demote_headings(isa_text)))

quick_reference = trim_trailing_rule(rewrite_isa_links(sections["## Quick Reference by Category"]))

parts = [
TITLE,
"",
render_version_bullets(version, version_note),
"",
"[toc]",
"",
"---",
"",
"\n\n".join(content_sections),
"\n\n".join(isa_blocks),
quick_reference,
"",
]
return "\n".join(part for part in parts if part is not None)


def validate_release_doc(text: str) -> None:
if text.count("# PTO micro Instruction Spec") != 1:
raise SystemExit("expected exactly one top-level title")
if "\n[toc]\n" not in text:
raise SystemExit("missing [toc] near top")
if re.search(r"^## Quick Reference by Category\b", text, flags=re.MULTILINE) is None:
raise SystemExit("missing Quick Reference by Category")
if re.search(r"^## Quick Reference by Category\b[\s\S]*\Z", text, flags=re.MULTILINE) is None:
raise SystemExit("Quick Reference by Category must be present at end")
if re.search(r"^## Appendix\b", text, flags=re.MULTILINE):
raise SystemExit("appendix content must not remain")
if "Updated:" in text or "review" in text.splitlines()[:8]:
raise SystemExit("beginning metadata must not remain")
if "## Correspondence Categories" in text or "CCE correspondence" in text:
raise SystemExit("correspondence content must not remain")


def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--version", required=True, help="Release version, e.g. 0.2")
parser.add_argument("--version-note", help="Version bullet text for the requested version")
parser.add_argument("--output", help="Explicit output path")
args = parser.parse_args()

output = Path(args.output) if args.output else RELEASE_DIR / f"vpto-spec-v{args.version}.md"
output.parent.mkdir(parents=True, exist_ok=True)

text = build_release_doc(args.version, args.version_note)
validate_release_doc(text)
output.write_text(text)


if __name__ == "__main__":
main()
16 changes: 16 additions & 0 deletions .codex/skills/llvm-test-tool-fallback/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: llvm-test-tool-fallback
description: When `lit` or `FileCheck` is missing from the current shell, look for the corresponding LLVM test tools in the environment or existing LLVM workspace before treating it as a repo issue.
---

# LLVM Test Tool Fallback

Use this skill when:
- `python3 -m lit` fails because `lit` is missing
- `FileCheck` is not in `PATH`
- a test command fails only because LLVM test tools are not available in the current shell

Rule:
- do not stop at `command not found`
- first try to find `lit` / `FileCheck` from the environment's LLVM toolchain or an existing LLVM workspace
- treat missing `lit` / `FileCheck` as an environment-tool issue, not as a PTOAS regression
Loading
Loading