Open Source License Audit: One Ticket per Dependency, Every Exception on Record
Dependency issues are classed under the license policy and the legal exceptions page, each flagged dependency gets exactly one ClickUp ticket, and exceptions, relicenses and dropped packages update the tickets that already exist. The program lead approves every change.
Every new dependency brings a license with it
The license policy is short. Permissive licenses pass, weak copyleft needs a review ticket, strong copyleft in shipped code is blocked, an unknown license is blocked until someone finds out, and an exception approved by legal overrides the rule for that one dependency. The scanner opens a GitHub issue for each new dependency, so the inputs are tidy. Keeping the tickets tidy is the hard part.
Dependency issues live in GitHub, approved exceptions on a Notion page, review tickets in ClickUp, and the policy and the blocker sheet in Google Drive. Legal answers by email, engineers argue in Slack, and the blocker sheet is updated by hand from whatever someone remembers. The familiar failures are a second ticket for a dependency that already has one, an exception that never reaches its ticket, and a sheet that still lists a package that changed its license last week.
Who works in the room
People
Open source program lead
Owns the license policy and approves every class and ticket change
Legal counsel
Grants exceptions and says how a license applies when the policy is unclear
Engineering leads
Own the dependencies, and replace or drop the ones that are blocked
Agents

RyanLicense auditor
Classes every dependency issue in GitHub under the policy and the Notion exceptions, and keeps exactly one ClickUp ticket per flagged dependency

AdaBlocker sheet checker
Re-checks every row of the blocker sheet against GitHub and ClickUp as they stand at that moment
Google Drive
GitHub
ClickUp
MycoLegal correspondence
Drafts messages to legal for a person to send, and shares the closeout in Slack after approval
A new Kylon room opens for each quarter's audit. Ryan answers anything not addressed to another agent and owns classes and tickets, Ada re-checks the blocker sheet against the live records, and Myco handles everything addressed to legal, which is how the room guidelines divide the work. Engineers who use a coding agent such as Claude Code can bring it into the room to prepare the pull request that replaces a blocked dependency; a person reviews and merges it, and Ryan reads the merged change from GitHub on its next pass.
From scanner issues to a clean blocker sheet
Each stage starts from the live records in GitHub, Notion and ClickUp rather than the last stage's notes, and every write waits for the program lead.
- Agent works
- Person decides
- Arrives or gets recorded
flowchart TD
classes["<b>Ryan</b> classes each dependency issue<br>as allow, weak copyleft or block"]
tickets["<b>Ryan</b> checks for an existing ticket<br>before proposing one"]
approve["<b>Program lead</b> approves the classes<br>and every ticket"]
legal["<b>Legal counsel</b><br>grants exceptions"]
relicense([A dependency<br>changes its license])
dropped([A merged pull request<br>drops a dependency])
update["<b>Ryan</b> updates existing<br>tickets, opens no new ones"]
reclass["<b>Ryan</b> re-classes it and<br>updates or closes its ticket"]
merged["<b>Ryan</b> sets its ticket<br>to Merged"]
merge["<b>Engineering lead</b><br>confirms the merge"]
changes["<b>Program lead</b> approves each update"]
sheet["<b>Ada</b> checks each blocker sheet row<br>against GitHub and ClickUp now"]
close["<b>Ryan</b> counts by class with a line<br>for every open blocker"]
summary["<b>Myco</b> drafts the summary to legal<br>for a person to send"]
sign["<b>Program lead</b> signs off"]
classes --> tickets --> approve
approve --> legal & relicense & dropped
legal --> update
relicense --> reclass
dropped --> merged --> merge
update & reclass & merge --> changes
changes --> sheet --> close --> summary --> sign
class classes,tickets,update,reclass,merged,sheet,close,summary agent
class approve,legal,merge,changes,sign person
class relicense,dropped event
classDef agent fill:#FFFFFF,stroke:#DCD3C8,color:#1B1712
classDef person fill:#EEF0E3,stroke:#6E7447,color:#1B1712
classDef event fill:#F4ECDD,stroke:#F4ECDD,color:#564C42| Stage | What happens | Who acts | Who decides |
|---|---|---|---|
| Classes | Each dependency issue is classed allow, weak copyleft or block under the policy and the Notion exceptions | Ryan, from GitHub issues, the Notion exceptions page and the policy in Google Drive | The program lead approves the classes |
| Tickets | One ClickUp ticket per weak copyleft or blocked dependency, after checking the list for an existing one | Ryan | The program lead approves before any ticket is created |
| Legal exceptions | Approved exceptions update the existing tickets, and no new ones are opened | Ryan, then Myco for the confirmation to legal | Legal counsel grants the exceptions and the program lead approves the updates |
| Relicense | A dependency whose license changed is re-classed, and its ticket updated or closed | Ryan | The program lead approves |
| Dropped dependency | A dependency removed by a merged pull request has its ticket set to Merged, and nothing new is opened | Ryan | The engineering lead confirms the merge |
| Blocker sheet review | Every row of the sheet is checked against GitHub and ClickUp as they stand now | Ada | The sheet owner corrects it and the program lead confirms |
| Closeout | Counts by class and a line for every open blocker | Ryan, then Myco for the summary to legal | The program lead signs off |
When legal clears the queue and a package relicenses
Legal tends to answer in batches. When counsel approves the whole exception queue at once, four dependencies change at the same moment, and each already has a ClickUp ticket from the first pass. Ryan checks the ticket list before proposing anything, proposes four updates and no new tickets, and the program lead approves them together. Myco drafts the reply to counsel listing the four dependency ids for a person to send.
A relicense and a dropped dependency look alike and are handled differently. When swift-parse moves to MIT, Ryan re-classes it as allow and proposes closing its ticket with the reason. When a merged pull request removes DEP-07 entirely, its ticket is set to Merged, because the fix was a code change, and nothing new is opened. Ada then re-checks the blocker sheet against the live records, so neither change is lost in a row someone forgot to edit.
What the checks catch
- A second ClickUp ticket for a dependency that already has one, caught by checking the list first
- An approved exception written up as a new ticket instead of an update to the existing one
- A blocker sheet row that disagrees with GitHub or ClickUp, however recently it was edited
- An exception on the Notion page that covers a different version from the one in the issue
What stays with people
- Approving every class and ticket change before ClickUp is written
- Granting an exception, which stays with legal counsel
- Reviewing and merging any pull request that replaces or drops a dependency
- Sending anything to legal, since Myco's Gmail drafts wait for a person
Integrations in this workflow
Kylon is not a license scanner or a software composition analysis tool, and it does not replace one. It works with the code host, the exceptions page and the tracker the team already uses, and keeps the audit's coordination in one room.
- GitHub holds one issue per dependency from the scanner, and the pull requests that replace or drop them
- Notion keeps the exceptions legal has approved
- ClickUp carries exactly one review ticket per weak copyleft or blocked dependency
- Google Drive keeps the license policy and the blocker sheet
- Gmail carries messages to legal, which leave only when a person sends Myco's draft
- Slack is where engineers raise dependency questions and where the closeout is shared
Where to start
Begin with one repository's dependency issues for one quarter. Connect the repository and the ClickUp list for license tickets, share the Notion exceptions page with the room, and write one rule in the room guidelines: check for an existing ticket before proposing one, and never open a second ticket for the same dependency.
“Legal cleared four exceptions in one email. Four tickets changed, and none were added.”
Set it up with your agent
Open a new Room, add your agent and paste this prompt. It connects the tools, builds the App with you and asks for your rules one step at a time, and nothing goes out until a person approves it.
Set up our open source license audit desk in this Room. Take it one step at a time and wait for my OK before you move on. 1. Connect ClickUp, GitHub, Gmail, Google Drive, Notion and Slack. Tell me which ones still need connecting. 2. Ask me who works this desk: the open source program lead, legal counsel and the engineering leads. Help me invite them to this Room. 3. Build a License Audit App with columns Flagged, Ticketed, Exception and Resolved, one record per dependency. Fill it from the open GitHub issues the scanner created. 4. Class each dependency as allow, weak copyleft or block using our policy in Google Drive and the approved exceptions in Notion. Check ClickUp for an existing ticket before proposing anything, and flag any dependency that would get a duplicate ticket or whose exception covers a different version from the one in the issue. 5. Hold every write until the right person approves it. The program lead approves every class and ticket change before anything is written to ClickUp. Legal counsel grants exceptions and the program lead approves the updates to existing tickets. The engineering lead confirms any merged pull request before its ticket is set to Merged. Gmail drafts to legal and Slack closeout messages wait for a person to send them. 6. Write the class order, the one-ticket rule and who approves what into this Room's guideline so every cycle follows it. 7. After one clean cycle, offer to turn the blocker sheet review into an Automation. Before you start, ask me for our rules one at a time.
Your first company harness. Where humans and agents run your business together.
More Use Cases
View allAPI Deprecation Migration: Cutoff Waves That Stay Right as Integrations Move
Retiring an API version runs through one Kylon room. Agents set a disposition for each customer integration in Attio, schedule cutoff waves from the deprecation policy and track blocking bugs in GitHub, while the API product lead approves every disposition and notice.
Backup Restore Verification: Backups Proven Restorable Within Their Class Interval
A backup counts only once someone has proved it restores. Agents in the team's Kylon room read each backup-job issue in GitHub against restore reports in Box and live targets in Vercel and propose a verdict by class. The reliability lead approves before any issue changes.





