Skip to content
Draft
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
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
### Repository identifiers validate owner and repository segments independently

- Queue-health repository identifiers now reject a trailing dot in either the
owner or repository segment while preserving valid leading-dot names such as
`.github`. RED commit `c3963dc88` reproduces `owner./repo`; source commit
`2f29c4b30` repairs the segment boundary and adds safe punctuation cases.
The focused regression and `GITHUB_ACTIONS=true` harness pass locally.
Hosted exact-head security Checks and independent review remain required.

### Intel macOS native archives are bound to x86_64 bytes

- The release prescreener now requires every native member in an Intel macOS
Expand Down
6 changes: 6 additions & 0 deletions docs/product-technical-gap-baseline.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
ํ˜„์žฌ ๋ณดํ˜ธ๋œ `main`: `826b92394c63deb6981c3a8d16a724d71f85a0d7`
ํ˜„์žฌ ์—ด๋ฆฐ PR ์ˆ˜: **107** (์•„๋ž˜ ํ‘œ์— ์ด ์Šค๋ƒ…์ƒท์˜ ์ „์ฒด ๋ชฉ๋ก ํฌํ•จ; live API ์žฌ์ˆ˜์ง‘)

### 2026-10-07 repository identifier trust-boundary delta

| Gap ID | ์ƒํƒœ | exact-head evidence | causal owner / next gate |
|---|---|---|---|
| CONTROL-QUEUE-REPOSITORY-SEGMENT-01 | **Source repaired on `.github#2595`; hosted exact-head acceptance pending** | Current-head review found that the first negative lookahead inspected the whole `owner/repository` string, so `owner./repo` bypassed the promised owner-segment trailing-dot rejection. RED `c3963dc88` binds that case and valid `.github`/punctuation inputs; GREEN `2f29c4b30` validates owner and repository segments independently. The focused direct regression, byte compilation, and `GITHUB_ACTIONS=true` execution pass locally. | Canonical owner is `scripts/ci/actions_queue_health_core.py` in central `.github`. Fresh hosted security Checks, full-suite evidence, resolved current-head review threads, qualifying independent approval, and ordinary protected merge remain mandatory; no bypass is authorized. |

์ด ๋ฌธ์„œ๋Š” ์ œํ’ˆยท๊ธฐ์ˆ ยท์šด์˜ Gap์„ ํ˜„์žฌ ๋ฌธ์„œ์™€ ํ˜„์žฌ GitHub ์ƒํƒœ์— ๋ฌถ์–ด ๋‘๋Š” ๊ธฐ์ค€์„ ์ด๋‹ค. ์ƒˆ ์ž‘์—…์€ ๋จผ์ € ์ด ๋ฌธ์„œ์˜ Gap ID๋ฅผ PR ์„ค๋ช…๊ณผ ํ…Œ์ŠคํŠธ ์ฆ๊ฑฐ์— ์—ฐ๊ฒฐํ•˜๊ณ , PR์˜ ์ •ํ™•ํ•œ exact HEADยทChecksยท๋ฆฌ๋ทฐ๋ฅผ ๋‹ค์‹œ ์ˆ˜์ง‘ํ•œ ๋’ค ๊ตฌํ˜„ํ•œ๋‹ค. ํ‘œ์˜ ์ƒํƒœ๋Š” ์ž‘์„ฑ ์‹œ์ ์˜ ๊ด€์ธก๊ฐ’์ด๋ฏ€๋กœ, ๋ณ‘ํ•ฉ ํŒ๋‹จ์—๋Š” ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ์ธ๋ฒคํ† ๋ฆฌ๋Š” ์Šค๋ƒ…์ƒท์ด๋ฉฐ merge authorization์ด ์•„๋‹ˆ๋‹ค.

### 2026-09-19 exact-head incident delta
Expand Down
4 changes: 3 additions & 1 deletion scripts/ci/actions_queue_health_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
from pathlib import Path
from typing import Any

REPOSITORY_PATTERN = re.compile(r"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$")
REPOSITORY_PATTERN = re.compile(
r"^(?!.*\.\.)(?![^/]*\./)[A-Za-z0-9_.-]+/(?![^/]*\.$)[A-Za-z0-9_.-]+$"
)
QUEUE_STATES = {"QUEUED", "IN_PROGRESS", "PENDING", "REQUESTED"}
TERMINAL_STATES = {"COMPLETED"}
DEFAULT_QUEUE_AGE_SLO_SECONDS = 900
Expand Down
20 changes: 19 additions & 1 deletion tests/test_actions_queue_health.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,13 +141,31 @@ def test_parse_timestamp_normalises_z_and_offsets() -> None:
assert queue_health.parse_timestamp("2026-08-19T21:00:00+09:00") == NOW


@pytest.mark.parametrize("value", ["owner", "owner/repo/extra", "../..", "./repo", "owner/.", 1])
@pytest.mark.parametrize(
"value",
[
"owner",
"owner/repo/extra",
"../..",
"./repo",
"owner/.",
"owner./repo",
"owner/repo.",
1,
],
)
def test_repository_name_rejects_non_repository_identifiers(value: object) -> None:
"""Reject malformed and traversal-like repository identifiers."""
with pytest.raises(queue_health.QueueHealthError):
queue_health._repository_name(value)


@pytest.mark.parametrize("value", [".github/repo", "owner/.github", "owner-name/repo_name"])
def test_repository_name_accepts_safe_identifiers(value: str) -> None:
"""Accept safe GitHub owner/repository identifiers with supported punctuation."""
assert queue_health._repository_name(value) == value


def test_load_allowlist_accepts_array_and_object_and_rejects_bad_inputs(tmp_path: Path) -> None:
"""Load both supported allowlist shapes and reject unsafe input files."""
array_path = tmp_path / "array.json"
Expand Down
Loading