rl-llm-wiki/rl-bucket-sync
0
1"""Taskforces (§18): creation, README updates, contributions, discovery."""2from __future__ import annotations3 4from app.frontmatter import serialise5from fakes import seed_agent6 7 8AGENT = "agent-1"9OTHER = "agent-2"10 11 12def _bucket(agent_id: str) -> str:13 return f"test-org/test-{agent_id}"14 15 16def _source(agent_id: str, path: str) -> str:17 return f"hf://buckets/{_bucket(agent_id)}/{path}"18 19 20def create_tf(21 env,22 name: str = "kernel-research",23 agent: str = AGENT,24 body: str = "# Kernel Research\n\nMaking attention kernels go fast.",25):26 return env.client.post(27 "/v1/taskforces", json={"name": name, "agent_id": agent, "body": body}28 )29 30 31# ───────────────────────── creation ─────────────────────────32 33 34def test_create_raw_writes_readme(env):35 seed_agent(env.hub, AGENT)36 r = create_tf(env)37 assert r.status_code == 201, r.text38 assert r.json() == {39 "name": "kernel-research",40 "via": "raw",41 "path": "taskforces/kernel-research/README.md",42 "created": True,43 }44 45 readme = env.hub.read_central_text("taskforces/kernel-research/README.md")46 assert "creator: agent-1" in readme47 assert "taskforce: kernel-research" in readme48 assert "Making attention kernels go fast." in readme49 50 # No automated announcement (§18.2): the board stays quiet — the creator51 # introduces the taskforce themselves.52 msgs = env.client.get("/v1/messages").json()53 assert msgs["count"] == 054 55 56def test_create_bucket_variant_preserves_client_frontmatter(env):57 seed_agent(env.hub, AGENT)58 env.hub.seed(59 "tf/readme.md",60 serialise({"title": "Kernel Research", "creator": "spoofed"}, "All things kernels."),61 bucket=_bucket(AGENT),62 )63 r = env.client.post(64 "/v1/taskforces",65 json={"name": "kernel-research", "source": _source(AGENT, "tf/readme.md")},66 )67 assert r.status_code == 201, r.text68 assert r.json()["via"] == "bucket"69 readme = env.hub.read_central_text("taskforces/kernel-research/README.md")70 assert "title: Kernel Research" in readme # client field preserved71 assert "creator: agent-1" in readme # server stamp wins over spoof72 assert "spoofed" not in readme73 74 75def test_create_requires_registration(env):76 r = create_tf(env)77 assert r.status_code == 40478 assert r.json()["error"]["code"] == "NOT_REGISTERED"79 80 81def test_create_rejects_invalid_name(env):82 seed_agent(env.hub, AGENT)83 r = create_tf(env, name="-bad-")84 assert r.status_code == 40085 assert r.json()["error"]["code"] == "INVALID_PATH"86 87 88def test_create_conflict_for_non_creator(env):89 seed_agent(env.hub, AGENT)90 seed_agent(env.hub, OTHER)91 assert create_tf(env).status_code == 20192 r = create_tf(env, agent=OTHER, body="mine now")93 assert r.status_code == 40994 assert r.json()["error"]["code"] == "TASKFORCE_EXISTS"95 96 97def test_creator_updates_readme(env):98 seed_agent(env.hub, AGENT)99 create_tf(env)100 first = env.client.get("/v1/taskforces/kernel-research").json()101 102 r = create_tf(env, body="# Kernel Research\n\nNow with a roadmap.")103 assert r.status_code == 200, r.text104 assert r.json()["created"] is False105 106 detail = env.client.get("/v1/taskforces/kernel-research").json()107 assert detail["created"] == first["created"] # creation stamp preserved108 assert detail["updated"] is not None109 assert "roadmap" in detail["readme"]["body"]110 111 112# ───────────────────────── contributions ─────────────────────────113 114 115def test_raw_note(env):116 seed_agent(env.hub, AGENT)117 create_tf(env)118 r = env.client.post(119 "/v1/taskforces/kernel-research/files",120 json={"agent_id": AGENT, "body": "Profiled the baseline: 40% in attention."},121 )122 assert r.status_code == 201, r.text123 data = r.json()124 assert data["kind"] == "note"125 assert data["filename"].endswith("_agent-1.md")126 127 notes = env.client.get(128 "/v1/taskforces/kernel-research/notes?expand=true"129 ).json()130 assert notes["matched"] == 1131 fm = notes["items"][0]["frontmatter"]132 assert fm["taskforce"] == "kernel-research"133 assert fm["type"] == "note"134 assert fm["via"] == "raw"135 136 137def test_bucket_note_dedup(env):138 seed_agent(env.hub, AGENT)139 create_tf(env)140 env.hub.seed("notes/profile.md", "kernel profiling notes", bucket=_bucket(AGENT))141 src = _source(AGENT, "notes/profile.md")142 first = env.client.post(143 "/v1/taskforces/kernel-research/files", json={"source": src}144 )145 assert first.status_code == 201, first.text146 assert first.json()["via"] == "bucket"147 second = env.client.post(148 "/v1/taskforces/kernel-research/files", json={"source": src}149 )150 assert second.status_code == 409151 assert second.json()["error"]["code"] == "ALREADY_PROMOTED"152 153 154def test_named_file_roundtrip(env):155 seed_agent(env.hub, AGENT)156 create_tf(env)157 env.hub.seed("out/profile.json", '{"tps": 123}', bucket=_bucket(AGENT))158 r = env.client.post(159 "/v1/taskforces/kernel-research/files",160 json={161 "source": _source(AGENT, "out/profile.json"),162 "dest_path": "profiles/flash_attn_agent-1.json",163 },164 )165 assert r.status_code == 201, r.text166 assert r.json() == {167 "kind": "file",168 "filename": "profiles/flash_attn_agent-1.json",169 "via": "bucket",170 "path": "taskforces/kernel-research/profiles/flash_attn_agent-1.json",171 }172 173 files = env.client.get("/v1/taskforces/kernel-research/files").json()174 paths = {f["path"] for f in files["items"]}175 assert paths == {"README.md", "profiles/flash_attn_agent-1.json"}176 177 raw = env.client.get(178 "/v1/taskforces/kernel-research/files/profiles/flash_attn_agent-1.json"179 )180 assert raw.status_code == 200181 assert raw.content == b'{"tps": 123}'182 assert raw.headers["content-type"].startswith("application/json")183 184 # Binaries/named non-md files never show up as notes.185 notes = env.client.get("/v1/taskforces/kernel-research/notes").json()186 assert notes["matched"] == 0187 188 189def test_named_md_file_appears_in_notes_view(env):190 seed_agent(env.hub, AGENT)191 create_tf(env)192 env.hub.seed(193 "out/survey.md",194 serialise({"type": "survey"}, "Long-form kernel survey."),195 bucket=_bucket(AGENT),196 )197 r = env.client.post(198 "/v1/taskforces/kernel-research/files",199 json={"source": _source(AGENT, "out/survey.md"), "dest_path": "survey_agent-1.md"},200 )201 assert r.status_code == 201, r.text202 notes = env.client.get(203 "/v1/taskforces/kernel-research/notes?expand=true&q=survey"204 ).json()205 assert notes["matched"] == 1206 assert notes["items"][0]["filename"] == "survey_agent-1.md"207 208 209def test_named_file_requires_marker(env):210 seed_agent(env.hub, AGENT)211 create_tf(env)212 env.hub.seed("out/profile.json", "{}", bucket=_bucket(AGENT))213 r = env.client.post(214 "/v1/taskforces/kernel-research/files",215 json={"source": _source(AGENT, "out/profile.json"), "dest_path": "profile.json"},216 )217 assert r.status_code == 400218 assert "_agent-1" in r.json()["error"]["message"]219 220 221def test_named_file_readme_leaf_reserved(env):222 seed_agent(env.hub, AGENT)223 create_tf(env)224 env.hub.seed("out/readme.md", "takeover", bucket=_bucket(AGENT))225 r = env.client.post(226 "/v1/taskforces/kernel-research/files",227 json={228 "source": _source(AGENT, "out/readme.md"),229 "dest_path": "docs_agent-1/README.md",230 },231 )232 assert r.status_code == 400233 assert "reserved" in r.json()["error"]["message"]234 235 236def test_contribute_to_unknown_taskforce(env):237 seed_agent(env.hub, AGENT)238 r = env.client.post(239 "/v1/taskforces/nope/files", json={"agent_id": AGENT, "body": "hello?"}240 )241 assert r.status_code == 404242 assert r.json()["error"]["code"] == "TASKFORCE_NOT_FOUND"243 244 245def test_contribution_requires_registration(env):246 seed_agent(env.hub, AGENT)247 create_tf(env)248 r = env.client.post(249 "/v1/taskforces/kernel-research/files",250 json={"agent_id": "ghost", "body": "drive-by"},251 )252 assert r.status_code == 404253 assert r.json()["error"]["code"] == "NOT_REGISTERED"254 255 256# ───────────────────────── discovery ─────────────────────────257 258 259def test_list_taskforces(env):260 seed_agent(env.hub, AGENT)261 seed_agent(env.hub, OTHER)262 create_tf(env, name="kernel-research")263 create_tf(env, name="eval-tooling", agent=OTHER, body="# Evals\n\nBetter eval harnesses.")264 env.client.post(265 "/v1/taskforces/kernel-research/files",266 json={"agent_id": OTHER, "body": "joining in"},267 )268 269 listing = env.client.get("/v1/taskforces").json()270 assert listing["count"] == 2271 assert listing["matched"] == 2272 by_name = {t["name"]: t for t in listing["items"]}273 # kernel-research has the newest activity (a note), so it sorts first.274 assert listing["items"][0]["name"] == "kernel-research"275 kr = by_name["kernel-research"]276 assert kr["creator"] == AGENT277 assert kr["contributors"] == [AGENT, OTHER]278 assert kr["note_count"] == 1279 assert kr["last_activity"] is not None280 assert "kernels" in kr["readme_excerpt"]281 et = by_name["eval-tooling"]282 assert et["contributors"] == [OTHER]283 assert et["last_activity"] is None284 285 filtered = env.client.get("/v1/taskforces?q=eval harnesses").json()286 assert filtered["matched"] == 1287 assert filtered["items"][0]["name"] == "eval-tooling"288 289 290def test_detail(env):291 seed_agent(env.hub, AGENT)292 seed_agent(env.hub, OTHER)293 create_tf(env)294 env.client.post(295 "/v1/taskforces/kernel-research/files",296 json={"agent_id": OTHER, "body": "fused kernel draft attached"},297 )298 299 detail = env.client.get("/v1/taskforces/kernel-research").json()300 assert detail["name"] == "kernel-research"301 assert detail["creator"] == AGENT302 assert detail["contributors"] == [AGENT, OTHER]303 assert detail["note_count"] == 1304 assert detail["file_count"] == 2 # README + note305 assert detail["readme"]["body"].startswith("# Kernel Research")306 assert detail["recent_notes"][0]["body"] == "fused kernel draft attached"307 308 309def test_detail_unknown_taskforce(env):310 r = env.client.get("/v1/taskforces/nope")311 assert r.status_code == 404312 assert r.json()["error"]["code"] == "TASKFORCE_NOT_FOUND"313 314 315def test_notes_grammar_filters(env):316 seed_agent(env.hub, AGENT)317 seed_agent(env.hub, OTHER)318 create_tf(env)319 for agent, body in ((AGENT, "first note"), (OTHER, "second note")):320 env.client.post(321 "/v1/taskforces/kernel-research/files",322 json={"agent_id": agent, "body": body},323 )324 notes = env.client.get(325 f"/v1/taskforces/kernel-research/notes?agent={OTHER}&expand=true"326 ).json()327 assert notes["matched"] == 1328 assert notes["items"][0]["body"] == "second note"329 330 331def test_raw_file_get_missing(env):332 seed_agent(env.hub, AGENT)333 create_tf(env)334 r = env.client.get("/v1/taskforces/kernel-research/files/nope.txt")335 assert r.status_code == 404336 assert r.json()["error"]["code"] == "NOT_FOUND"337 338 339def test_digest_includes_taskforces(env):340 seed_agent(env.hub, AGENT)341 create_tf(env)342 digest = env.client.get("/v1/digest").json()343 assert digest["taskforces"]["count"] == 1344 assert digest["taskforces"]["newest"] == ["kernel-research"]345 