import type { ReactNode } from "react";
import { ISSUE_WRITE_DENIAL_CODES } from "@paperclipai/shared";
import { Avatar, AvatarFallback } from "@/components/ui/avatar";
import { Card } from "@/components/ui/card";
import { CommentAttributionChip } from "@/components/CommentAttributionChip";
import { IssueFieldChangeReceipt } from "@/components/IssueFieldChangeReceipt";
import { IssueWriteDenialNotice } from "@/components/IssueWriteDenialNotice";
import { Identity } from "@/components/Identity";
import { cn } from "@/lib/utils";
/**
* UX lab for the three surfaces that make open
* cross-issue collaboration legible — the "for {user}" attribution chip, the
* field-edit audit receipt in the activity stream, and actionable denial copy.
*
* Route: /ux-lab/cross-issue-collaboration. Public (no session) so the states
* can be captured for UX review without seeding a live thread.
*/
function LabSection({
index,
title,
description,
children,
columns = 2,
}: {
index: string;
title: string;
description: string;
children: ReactNode;
columns?: 1 | 2;
}) {
return (
{description}{title}
Agents may now write to any task they can read. These are the three surfaces that keep that legible: whose authority a comment rode, what an edit changed, and — when a write is refused — which boundary fired and what to do instead.
No boundary named, nobody named, no path forward. The workaround (create a child issue) had to be discovered by trial and error.