diff --git a/.changeset/open-tag-comments.md b/.changeset/open-tag-comments.md
new file mode 100644
index 00000000..daf9e42e
--- /dev/null
+++ b/.changeset/open-tag-comments.md
@@ -0,0 +1,5 @@
+---
+"htmljs-parser": minor
+---
+
+Add an `onOpenTagComment` handler for a JavaScript comment that stands alone in an open tag, eg `
` or a `// why` line between attributes, which the parser used to consume without an event. A comment that follows a value is still part of that value. It is a separate handler from `onComment`, so a consumer only sees these comments once it handles them.
diff --git a/README.md b/README.md
index 70b79aae..b31bdec9 100644
--- a/README.md
+++ b/README.md
@@ -383,6 +383,19 @@ const parser = createParser({
range.value; // Another range that includes only the value itself without the leading ...
},
+ /**
+ * Called after parsing a JavaScript comment that stands alone in an open tag.
+ * A comment that follows a value is part of that value instead.
+ *
+ * @example
+ * 1╭─
+ * │ │ ╰─ openTagComment.value " hi "
+ * ╰─ ╰─ openTagComment "/* hi */"
+ */
+ onOpenTagComment(range) {
+ range.value; // Another range that only includes the contents of the comment.
+ },
+
/**
* Called once we've completed parsing the open tag.
*
diff --git a/agent-feedback/items/2026-08-20-report-comments-inside-an-open-tag.md b/agent-feedback/items/2026-08-20-report-comments-inside-an-open-tag.md
deleted file mode 100644
index a69ba0e0..00000000
--- a/agent-feedback/items/2026-08-20-report-comments-inside-an-open-tag.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-type: bug
-impact: med
-effort: low
-site: src/states/OPEN_TAG.ts › OPEN_TAG
----
-
-# Report the JavaScript comments that sit between attributes in an open tag
-
-`OPEN_TAG.parse` enters `STATE.JS_COMMENT_LINE`/`STATE.JS_COMMENT_BLOCK` for a `//` or `/*` inside an open tag, but `OPEN_TAG.return` bails on every child that is not `STATE.EXPRESSION`, so the comment is consumed and `onComment` never fires. A comment trailing an attribute value survives because `EXPRESSION` folds it into the value range, which is what `src/__tests__/fixtures/comments-within-open-tag` records; a comment that stands on its own is unreportable, so `
x
` and the `// why` line of a multi-line attribute list emit attribute events only, with no error. Consumers cannot round-trip either one — prettier-plugin-marko drops both from its output — while `OPEN_TAG.parse`'s own `INVALID_HTML_COMMENT` text tells authors to "Use a JavaScript comment (// or /\* \*/) instead", pointing them at the form that disappears. `HTML_CONTENT.return` already emits both shapes with the delimiters stripped from `value`, so the fix is that switch in `OPEN_TAG.return`, with `comments-within-open-tag` and `open-tag-comments-concise` as the snapshots that move.
-
-Check: `node --input-type=module -e 'import{createParser}from"./src/index.ts";const p=createParser({onComment:r=>console.log("comment",JSON.stringify(p.read(r))),onAttrName:r=>console.log("attrName",JSON.stringify(p.read(r)))});p.parse("
x
")'` prints only `attrName "class"` today; expect a `comment "/* c */"` line before it.
diff --git a/src/__tests__/fixtures/open-tag-comments-concise/__snapshots__/open-tag-comments-concise.expected.txt b/src/__tests__/fixtures/open-tag-comments-concise/__snapshots__/open-tag-comments-concise.expected.txt
index e8afccdd..a1ccfacb 100644
--- a/src/__tests__/fixtures/open-tag-comments-concise/__snapshots__/open-tag-comments-concise.expected.txt
+++ b/src/__tests__/fixtures/open-tag-comments-concise/__snapshots__/open-tag-comments-concise.expected.txt
@@ -1,9 +1,13 @@
1╭─ div /* c */ a=1
- │ │ ││╰─ attrValue.value
- │ │ │╰─ attrValue "=1"
- │ │ ╰─ attrName
+ │ │ │ │ ││╰─ attrValue.value
+ │ │ │ │ │╰─ attrValue "=1"
+ │ │ │ │ ╰─ attrName
+ │ │ │ ╰─ openTagComment.value " c "
+ │ │ ╰─ openTagComment "/* c */"
╰─ ╰─ tagName "div"
2╭─ span // d
+ │ │ │ ╰─ openTagComment.value " d"
+ │ │ ╰─ openTagComment "// d"
│ ├─ closeTagEnd(div)
│ ├─ openTagEnd
╰─ ╰─ tagName "span"
diff --git a/src/__tests__/fixtures/open-tag-comments/__snapshots__/open-tag-comments.expected.txt b/src/__tests__/fixtures/open-tag-comments/__snapshots__/open-tag-comments.expected.txt
new file mode 100644
index 00000000..f585f2f1
--- /dev/null
+++ b/src/__tests__/fixtures/open-tag-comments/__snapshots__/open-tag-comments.expected.txt
@@ -0,0 +1,47 @@
+1╭─