Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
b66a4d7
Recognize constrained Semgrep query operators as matching data
yashrajp22 Nov 5, 2026
85146b2
Exercise cancellation during advanced query proof
yashrajp22 Nov 5, 2026
6a27274
Use bounded inline ownership for rule message diagnostics
yashrajp22 Nov 5, 2026
a7fd83c
Preserve original command consumers in message ownership checks
yashrajp22 Nov 5, 2026
9f2207e
Keep unresolved command boundaries distinct from ownership limits
yashrajp22 Nov 5, 2026
84d70a4
Check inline consumers after ordinary message refinement
yashrajp22 Nov 5, 2026
76533fb
Respect complete shell word ownership in message checks
yashrajp22 Nov 5, 2026
0ef2894
Distinguish raw shell assignments from quoted argument data
yashrajp22 Nov 5, 2026
363e032
Prove bounded output argument ownership before skipping data words
yashrajp22 Nov 5, 2026
7f72da5
Bind displayed output arguments to their native owners
yashrajp22 Nov 5, 2026
79d8a5c
Keep ambiguous import references conservative
yashrajp22 Nov 5, 2026
236cd9f
Preserve native prose punctuation ownership in message checks
yashrajp22 Nov 5, 2026
ddf8a27
Derive native clause ownership before inline projection
yashrajp22 Nov 5, 2026
456e030
Keep displayed body checks within their literal boundaries
yashrajp22 Nov 5, 2026
282f569
Distinguish literal child quotes from runtime command inputs
yashrajp22 Nov 5, 2026
8eb717b
Inspect message consumers without reparsing display fragments
yashrajp22 Nov 5, 2026
26bd732
Merge shell source-binding checks into inline message inspection
yashrajp22 Nov 5, 2026
5c621f8
fix: scope message refinement to existing parser gaps
yashrajp22 Nov 5, 2026
f1f223b
test: retain split command gap as a known limitation
yashrajp22 Nov 5, 2026
5c2ee75
fix: inspect native Markdown command inputs
yashrajp22 Nov 6, 2026
b22a27d
Preserve native replace-value ownership before command interpretation
yashrajp22 Nov 6, 2026
60b8779
Use native line boundaries for proven replace values
yashrajp22 Nov 6, 2026
ce44dbf
Keep carriage-return statements outside native value ownership
yashrajp22 Nov 6, 2026
3308833
Retain POSIX semantics for explicitly executed child values
yashrajp22 Nov 6, 2026
5f4a72a
Use physical line boundaries for native value statements
yashrajp22 Nov 6, 2026
cd2c4d5
fix: retain wrapped command and native prefix uncertainty
yashrajp22 Nov 6, 2026
4052bd8
fix: keep native append prefixes explicitly unsupported
yashrajp22 Nov 6, 2026
72ac827
Merge branch 'main' into yashraj/semgrep-inline-message-ownership
github-actions[bot] Nov 6, 2026
4dcef9b
Merge branch 'main' into yashraj/semgrep-advanced-query-ownership
github-actions[bot] Nov 6, 2026
e86f4a2
Merge branch 'main' into yashraj/semgrep-inline-message-ownership
github-actions[bot] Nov 6, 2026
b81250d
fix: distinguish displayed fragments from executed command words
yashrajp22 Nov 6, 2026
7f9bcff
test: preserve native diagnostic precedence for substitutions
yashrajp22 Nov 6, 2026
d5c737c
fix: keep unproved display quotes outside command execution
yashrajp22 Nov 6, 2026
0057acb
test: retain incomplete parameter and backtick boundaries
yashrajp22 Nov 6, 2026
d281e81
test: separate opaque inline delimiters from their content
yashrajp22 Nov 6, 2026
b7f2503
test: bind malformed parameter checks to executed operands
yashrajp22 Nov 6, 2026
21a1e70
fix: preserve native inline display value ownership
yashrajp22 Nov 6, 2026
af2185f
fix: bind native property values to documented argument roles
yashrajp22 Nov 6, 2026
ade624e
fix: retain native property argument prefix ownership
yashrajp22 Nov 6, 2026
96b0c83
fix: retain uncertainty for declared dynamic property bindings
yashrajp22 Nov 6, 2026
fe77ced
fix: retain imported native object binding uncertainty
yashrajp22 Nov 6, 2026
8d97b84
Add nonblocking notices for unsupported prose command patterns
yashrajp22 Nov 6, 2026
413447b
fix: retain native argument bounds during Markdown inspection
yashrajp22 Nov 6, 2026
178c99b
Notice unsupported outer shell notation in rule messages
yashrajp22 Nov 6, 2026
d81617f
Use direct bounded word reads for documentation notices
yashrajp22 Nov 6, 2026
a11cd3d
Carry native argument ownership into inspection notices
yashrajp22 Nov 6, 2026
caf588c
Merge branch 'main' into yashraj/unsupported-prose-inspection-notices
github-actions[bot] Nov 6, 2026
c401def
Merge branch 'main' into yashraj/markdown-command-input-coverage
github-actions[bot] Nov 6, 2026
8ba1de2
Merge branch 'main' into yashraj/semgrep-inline-message-ownership
github-actions[bot] Nov 6, 2026
9988ec5
Merge branch 'main' into yashraj/semgrep-advanced-query-ownership
github-actions[bot] Nov 6, 2026
32ec3a6
Merge branch 'main' into yashraj/unsupported-prose-inspection-notices
github-actions[bot] Nov 6, 2026
4fc11f4
Merge branch 'main' into yashraj/markdown-command-input-coverage
github-actions[bot] Nov 6, 2026
6e16877
Merge branch 'main' into yashraj/semgrep-inline-message-ownership
github-actions[bot] Nov 6, 2026
ad145a4
Merge branch 'main' into yashraj/semgrep-advanced-query-ownership
github-actions[bot] Nov 6, 2026
3981406
Merge main into advanced Semgrep query ownership
yashrajp22 Nov 10, 2026
411e693
Merge main into inline rule message ownership
yashrajp22 Nov 10, 2026
9f29973
Merge main and retain native Markdown command ownership
yashrajp22 Nov 10, 2026
99d752c
Merge main and preserve documentation inspection notices
yashrajp22 Nov 10, 2026
8c7d9aa
Merge current parser ownership updates
yashrajp22 Nov 10, 2026
8c5ec3c
Merge current parser dependencies
yashrajp22 Nov 10, 2026
2180a9f
Merge current native source ownership
yashrajp22 Nov 10, 2026
907523e
Merge current parser and reporting dependencies
yashrajp22 Nov 10, 2026
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
56 changes: 56 additions & 0 deletions src/skillspector/inspection_ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
)
MAX_FINDING_OUTPUT_RECORDS: Final = 10_000
MAX_EFFECTIVE_FINDINGS: Final = MAX_FINDING_OUTPUT_RECORDS
UNSUPPORTED_PROSE_COMMAND_PATTERN: Final = "unsupported_prose_command_pattern"
UNSUPPORTED_PROSE_COMMAND_NOTICE: Final = (
"This command pattern is not allowed for inspection; put the command in a code block."
)
RESOURCE_MEASUREMENT_UNITS: Final = (
"characters",
"bytes",
Expand Down Expand Up @@ -841,6 +845,55 @@ class AnalysisCompleteness(TypedDict):
dependency_inspection: NotRequired[dict[str, object]]
policy_accepted: NotRequired[bool]
warnings: NotRequired[list[dict[str, object]]]
notices: NotRequired[list[dict[str, object]]]


def bounded_inspection_notices(rows: object) -> list[dict[str, object]]:
"""Keep documentation notices separate from inspection gaps and findings."""
if not isinstance(rows, list) or MAX_FINDING_OUTPUT_RECORDS <= 0:
return []
notices: dict[tuple[str, int, int], dict[str, object]] = {}
for row in rows[:MAX_INSPECTION_LEDGER_EVENTS]:
if (
not isinstance(row, Mapping)
or row.get("reason_code") != UNSUPPORTED_PROSE_COMMAND_PATTERN
):
continue
path = row.get("path")
if not isinstance(path, str):
continue
try:
path = _normalize_relative_path(path)
except ValueError:
continue
start, end = row.get("source_start_offset"), row.get("source_end_offset")
first, last = row.get("start_line"), row.get("end_line")
if not (
type(start) is int
and type(end) is int
and 0 <= start < end < (1 << 63)
and type(first) is int
and type(last) is int
and 1 <= first <= last < (1 << 63)
):
continue
key = (path, start, end)
notices.setdefault(
key,
{
"reason_code": UNSUPPORTED_PROSE_COMMAND_PATTERN,
"message": UNSUPPORTED_PROSE_COMMAND_NOTICE,
"phase": "documentation",
"path": path,
"start_line": first,
"end_line": last,
"source_start_offset": start,
"source_end_offset": end,
},
)
if len(notices) >= MAX_FINDING_OUTPUT_RECORDS:
break
return list(notices.values())


def _normalize_relative_path(path: str, *, scope_boundary: bool = False) -> str:
Expand Down Expand Up @@ -1645,6 +1698,9 @@ def accounting_error(path: object = None) -> None:
"findings_before_filtering": len(findings_by_id),
"findings_after_filtering": len(validated_effective),
}
notices = bounded_inspection_notices(state.get("inspection_notices"))
if notices:
completeness["notices"] = notices
patterns = state.get("exclude_patterns", [])
dependency_inspection = state.get("dependency_inspection")
if isinstance(dependency_inspection, dict):
Expand Down
Loading
Loading