mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
"""Doc-stage bail rejections must name the real exit: i_documented.
|
|||
|
|
|
||
|
|
Live loop (2026-07-02, b8fe0494): fe-doc respawned 26 times on a revision
|
||
|
|
pass — the docs were already written, the agent wouldn't call i_documented
|
||
|
|
for work it didn't author, and its bail attempts (i_am_blocked/unclaim) were
|
||
|
|
rejected with a generic remediate that never mentioned the one verb that IS
|
||
|
|
the exit from awaiting_documentation.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from dataclasses import dataclass, field
|
||
|
|
from uuid import uuid4
|
||
|
|
|
||
|
|
from roboco.foundation.identity import Role
|
||
|
|
from roboco.foundation.policy.lifecycle import Context, can_invoke_intent
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class _Task:
|
||
|
|
status: object = "awaiting_documentation"
|
||
|
|
assigned_to: object = None
|
||
|
|
task_type: object = "code"
|
||
|
|
team: object = "frontend"
|
||
|
|
created_by: object = field(default_factory=uuid4)
|
||
|
|
|
||
|
|
|
||
|
|
def test_doc_block_rejection_points_at_i_documented() -> None:
|
||
|
|
doc = uuid4()
|
||
|
|
task = _Task(assigned_to=doc)
|
||
|
|
decision = can_invoke_intent(
|
||
|
|
Role.DOCUMENTER, "i_am_blocked", task, Context(actor_id=doc)
|
||
|
|
)
|
||
|
|
assert not decision.allowed
|
||
|
|
assert "i_documented" in (decision.remediate or "")
|