"""디스크 경로 세그먼트 slug 규칙.

`okstra_ctl.ids` 와 `okstra_ctl.paths` 가 경로를 조립할 때마다 쓰는 순수 규칙이다.
이 규칙이 `okstra_project.state`(622줄짜리 상태 접근자) 안에 있던 동안에는
`okstra_ctl/__init__.py` → `.ids` → `okstra_project.state` 경로가 생겨,
`state` 가 okstra_ctl 을 되짚는 모든 호출을 함수 본문 지연 import 로 밀어냈다.
그 쐐기를 뽑기 위해 규칙만 leaf 로 분리한다.

이 모듈은 표준 라이브러리 외에 아무것도 import 하지 않는다. 그 성질이 위
설명의 전제이므로 import 를 추가하기 전에 순환이 되살아나지 않는지 확인할 것.
"""
from __future__ import annotations

import re

def slugify(value: str) -> str:
    """task-group / task-id segment 를 디스크 경로용 slug 로 정규화한다.

    소문자화 + 알파넘 외 문자 → '-' 로 collapse.
    okstra.sh 의 path-resolve.sh slug 규칙과 일치해야 한다.
    """
    value = (value or "").lower()
    value = re.sub(r"[^a-z0-9]+", "-", value).strip("-")
    return value
