proposal: llm contribution policy#880
Conversation
KirstieJane
left a comment
There was a problem hiding this comment.
Hi @minrk ❤️
Thank you for getting us started with this policy. It is always helpful to have a document to work from.
I don't want to approve this policy as written as I feel it doesn't demonstrate a welcoming tone that is more characteristic of the community communications across JupyterHub. I've marked my review as "Request Changes" for that reason.
Rather than try to make suggestions in a review I've tried to do a re-write to capture the tone I'm looking for in a pull request to your branch: minrk#3
(This may be a very chaotic plan and I'm happy to just open a separate pull request if that's easier! Or you can re-write yourself. Whatever pathway makes sense!)
What I've tried to do in that PR is motivate a little more what we (the JupyterHub community) value and align the policy with those principles.
I don't think I've materially changed the policy part of your proposal. I have definitely changed the tone of the document though! So please consider my PR as me trying to be constructive in getting us (all, the whole JupyterHub community) to a place we feel we can endorse, even if we don't all agree!
I'm pretty happy with the version I submitted. The only thing I don't actually like is the requirement to "write the code / docs yourself". I'd personally prefer that to be more focused around accountability rather than the means through which the characters appeared in the file. HOWEVER, I know you (Min) and I have talked about this briefly in private conversations and I think you feel more strongly about this than I do. So this is a policy compromise I can make. I'm just noting it here in case others feel similarly to me and what to suggest further changes.
Some support on a couple of references would be really helpful! I had a couple that were easy to google, but I don't know the best resources for copyright considerations and reviewer burden!
Thank you again for getting us started in this discussion. These are tough and destabilizing times. Being able to work with others who care deeply about the world - the people and the place itself - is one of the great privileges of being in this community 🫂
|
Hey @KirstieJane, I agree with you that the word of the policy could have a more friendly tone. I don't like the wording in
What does "accountability" mean? And how does "accountability" works when many open source licenses includes "without warranty" clause? My understanding of the rules of open source is that when the pull request of the 1-time contributor Alice Doe is merged by the maintainer Jane Doe, the "accountability" is transfer from Alice Doe to Jane Doe. |
Good point! Happy to change the wording! What I mean in this case - using your example - is that contributor Alice Doe takes accountability for what they're submitting before it is merged. In fact, before it is reviewed - a gate that potentially signals that the work is ready / worth a reviewer spending time on. I agree that once the code is merged then the accountability moves over into the project (Jane Doe's) responsibility. |
|
Instead of Lobster's I'd rather use an AGENTS.md file more like ghostty's except without the mean bit at the end: |
I made comments on your PR since that's the only way for me to do line by line comments. 😅 I do recognize you said discussion here but I didn't have a way to do line by line comments in here. I like the kindness and diplomacy in your additions @KirstieJane. |
|
(I drafted this before i saw any other comments, and I think it's still worthwhile for me to post) First, I'm excited and grateful that you are taking on this work to produce this draft, Min. It's hard and often thankless leadership work - thank you very much for doing it. I very much like this draft policy! In particular, I like that it offers a fairly straightforward tool for existing maintainers and community members - to ask the question "Did you write this?".
I would probably add a few examples on how to use this tool, and how to handle the different potential cases. This can iterate and change over time. I also think in spirit this policy shares a lot of similarity to Jellyfin's (https://jellyfin.org/docs/general/contributing/llm-policies/) and I'd recommend stealing from them what we can too. Does this increase the barrier to entry?All contributor policies are barriers - if we didn't have any barriers, we would just automerge every PR ever. The question is always about what the shape of the barrier is - what behavior it lets in, what it keeps out. Code of Conducts increase the barrier for participation too - the point is that it lets us keep in and invite more behavior we want, and keeps out behavior that would cause harm. The hope with an LLM use policy is to continue to shift the shape of our barriers to protect us (both the community, and the world at large we live in). Draft SuggestionsTo iterate on this draft, to keep the spirit but change some of the text, I'd suggest these next steps:
Does it matter who wrote it?(this is a sidebar that's historical and only sort of relevant, so ignore if this is already too long) "Did you write this?" is, in fact, a question that many other projects have been asking for ages through Developer Certificate of Origin or Contributor License Agreement. The purpose of both DCO and CLAs were to protect communities against legal threats - see the SCO Lawsuit v Linux for some history (and find me elsewhere to talk about how companies sometimes use CLAs to control who can profit off community work). So the question of authorship was important - it helped answer "Did you write this? Do you own the thing you wrote, so you can actually give it to us under these license terms?". DCOs and CLAs helped answer both of these questions about identity. People can always lie to answer both those questions - and different projects enforce / check for these through different mechanisms, based on their risk tolerance. JupyterHub does not have a CLA nor require a DCO, because the risks that have been mitigated by those tools were never threats to us. So we didn't need to explore doing either of these. I don't think that has changed. However, the risk from LLM generated content is definitely much more real, both for the people of this community (internal costs) but also for the many many many at risk populations outside this community (external costs). You've succinctly laid out many of the issues I have, so I'm not going to rehash them. Given these costs, it absolutely makes sense for us to experiment with asking forms of the question "Did you write this?" tailored to the risks we face. |
The grand irony of not including even a basic AGENTS.md will be that people will open our repositories with Cursor, VS Code, Zed, etc. When that happens, the agents will go searching through the repository to gather context. They will not go find a document over on a separate repository. Heck, even humans won't be searching through somewhat obscure governance documents in separate repositories. Especially not those using AI to help them work on a specific bug or feature in a project. We should be discouraging behavior at the source of what an LLM reads if we wish to stop it. |
|
For what it's worth, I've been using the linked to AGENTS.md file from lobste.rs on my own projects and am pretty happy with it. I think the core of the issue for me is around the wholesale harms to the planet we live in, and the magnitude of that compared to basically everything else. That's hard to handle at the scale of the thing we do control (how we want our communities to be), but it's important to do so - a world ravaged intensely by climate change and economic / political chaos isn't a world that open source projects like JupyterHub can exist in. That's the challenge to meet, and I look forward to us collectively experimenting with how we meet that. |
Kirstie's proposed revision of the LLM policy
minrk
left a comment
There was a problem hiding this comment.
Thanks for these great suggestions! I think it's better overall, but goes a little too far in some places I want to bring back to opposing clear harms.
|
|
||
| # Generative AI/LLM Contribution Policy | ||
|
|
||
| We ask that all contributions (through issues and pull requests) are made by a human who is willing to take accountability for the code, documentation or comment they submit. |
There was a problem hiding this comment.
I'll add something back here to get "Did you write this?" in the tl;dr. I think we should also put an "In short: LLM-generated contributions are not accepted."
| * We respect the **time** taken to read and review contributions, maintinaing a high standard and supportive community engagement. | ||
| * **security**: JupyterHub is trusted infrastructure for hundreds of thousands of users and we prioritize keeping their data, code, and personal configuration information secure. | ||
| * **veracity**: beyond security, we ensure our tools do what we think they do, and that we respect accuracy in communications within and beyond the scientific open source ecosystem. | ||
| * **our global society**: we seek to minimise environmental impact and human exploitation in the development and deployment of JupyterHub infrastructure. |
There was a problem hiding this comment.
Big +1. This is what almost always gets left out! JupyterHub can not exist in a world that's 2+ Celcius warmer on average, not to mention the other potential economic / political harms.
There was a problem hiding this comment.
I recognize this is hard given that we rely heavily on non-LLM services from these same organizations for many other things (like this GitHub we are using). However, I do think magnitude matters ("dose makes the poison"), as well as recognizing learned helplessness around what is 'inevitable' and what is not. I appreciate the current wording's use of 'minimize', as that is in fact the best we can do.
There was a problem hiding this comment.
I'm glad this section resonates! I think its important to remind us all what we are FOR rather than just what we are against 💖
I also didn't figure out how to include the political harms / threats to democracy .... but I'm very happy to include those (as they're one of the things that I am most concerned about!) Happy to iterate on any suggested phrasings (and I'll noodle myself) if folks think that would be a good additional bullet point?
There was a problem hiding this comment.
I like this section too! +1 to rooting ourselves in principles, values, and goals.
|
|
||
| Large language models (LLMs) are: | ||
|
|
||
| * changing, and at time of writing (February 2026) **over-burdening**, the reviewing capacity for many open source projects. [REF] |
There was a problem hiding this comment.
I think this hedges a little too far. I think we can keep the fact that LLMs are causing a great deal of harm to maintainer capacity. I don' think there's a reason to imply that this will get better in the foreseeable future.
There was a problem hiding this comment.
I'm going to note here that I think this is a point where you and I differ @minrk. I'm definitely in a more hopeful space that maintainers can (maybe through sensible policies) manage and decrease some of these burdens!
(Its not like the current status quo was working particularly well either.... so some sort of change is necessary! I believe in our human creativity 💪)
❓ What do others in the community think?
There was a problem hiding this comment.
Super helpful comment from me... I agree with both of you! I'm hopeful that this can get better and I don't think that's useful information for the policy :) When creativity eventually prevails, we can update the policy with new information!
|
|
||
| 1. Only submit code or documentation to JupyterHub that you wrote and that you understand. | ||
| * We have chosen this requirement given our concerns around **copyright**, **reviewer burden**, and to maintain **auditable accountability** for the **veracity** of our work. | ||
| * We leave the interpretation of this request to you: tool-assisted coding and automation leaves some gray areas and we recognize that everyone has different perspectives on the use of LLMs for supporting their open source contributions. |
There was a problem hiding this comment.
I really want to keep the words, that you must be able to say "I wrote this." Maybe add a bullet:
- when submitting code or comments, always start by making sure you can comfortably say "I wrote this."
There was a problem hiding this comment.
@minrk - can you explain why this phrasing is so important to you? I can imagine a few different reasons and I think it would be helpful to know the specifics.
The reason I softened the wording (and I did know I was softening it - thank you for engaging to suggest it back!) is that I have been in some conversations that imply that using a tool (any tool!) but then writing out the submission by hand is ok.... and that feels like such an awkward recommendation!
There was a problem hiding this comment.
The wording "I wrote this" doesn't resonate with me, it feels more about the mechanics of who/what typed the code than who is intellectually responsible for it. I don't know how to do better right now but I am also interesting in hearing an argument for this wording :)
There was a problem hiding this comment.
I appreciate that! FWIW, that's why I chose "wrote" as opposed to "typed". Trying to get to a higher-level evaluation of authorship, and "wrote" was the. best word I could think of for that. I particularly want to be able to distinguish between an ownership sense between:
- "I wrote this, and used some tools to help me do it" (OK), vs
- "I got Claude to write this, and I reviewed it and vouch for it" (not OK)
There was a problem hiding this comment.
"I authored this"? Does that resonate with you? To me it feels closer to what you're trying to communicate. And the longer version of "I authored this" might be "I did the thinking, and I can explain every decision".
Even "I got Claude to write this, and I reviewed it and vouch for it" (not OK) doesn't quite resonate with me -- I did something like this recently that I think would have fallen in to this "not OK" category based on my current interpretation. I had a large configuration that was written in JSON and was very confusing (expressed as two files with unclear boundaries), and it needed a more expressive medium and clear design. I defined a data model and had Claude migrate the config to Python objects, and it did a great job, I just reviewed it and made minor adjustments. It's a very rote activity that I would not have wanted to "write" myself (and I have an RSI, extra motivation to not write it myself), but I would have produced the same outcome if I had "written" it. But again, this may come down to we mean slightly different things by "write".
Full disclosure, I couldn't find a better word than "wrote" and Claude helped me out 😆 "authored" feels less mechanical to me than "wrote", which feels less mechanical than "typed".
I feel guilty that this feels a bit nitpicky. But I hope it's useful 🙃
There was a problem hiding this comment.
To me, "authored" doesn't mean anything different from "wrote" other than using a noun as a verb (which I personally really dislike style-wise, sorry for being nitpicky myself!). We already have a verb for what authors do: "write", which to me is distinct from the mechanical operation. But I agree with the goal you express. Maybe we just can't have a version that's both short and clear.
There was a problem hiding this comment.
Interesting! I've always thought of "to author" as a valid verb for "to create". I did a bit of googling since I felt challenged by your comment and found, and the first result was bizarrely relevant to exactly this conversation 😆 https://www.merriam-webster.com/grammar/author-as-a-verb
Maybe we just can't have a version that's both short and clear.
I sadly agree this is often true. But I would love to. Please let me know if the article I linked changes your thoughts at all!
There was a problem hiding this comment.
Thanks for the link! Yeah, I definitely don't think it's wrong, the phrase just feels off to me. Genuinely a personal preference for me. I just also feel like "I wrote this" also means "I created this," but I also ackmowledge a policy is for resolving ambiguity, so if folks read it differently, that's important to resolve!
I'd be happier with "I created this" or "I made this" than "I authored this"
There was a problem hiding this comment.
I like those too. And I was debating whether to attach that exact image yesterday 😆
| 1. Only submit code or documentation to JupyterHub that you wrote and that you understand. | ||
| * We have chosen this requirement given our concerns around **copyright**, **reviewer burden**, and to maintain **auditable accountability** for the **veracity** of our work. | ||
| * We leave the interpretation of this request to you: tool-assisted coding and automation leaves some gray areas and we recognize that everyone has different perspectives on the use of various tools for supporting their open source contributions. | ||
| * Always make sure you are comfortable saying "I wrote this" before submitting code or a comment. |
There was a problem hiding this comment.
I like this a lot, and I would suggest elevating this to the 'in short' section as well.
| Please do not use the verbatim output of an LLM in conversation with our user, reviewer and maintainer community. | ||
| * We have chosen this requirement given our priority to **value human co-creation**. | ||
| 3. Will will not include or accept supporting resources in `AGENTS.md`, `CLAUDE.md` or similar files to our repos as we prefer human contributors follow the [contribution guidelines](guide.md) that already exist. | ||
| If present, these files shall only include instructions to _prevent_ generating contributions. |
Co-authored-by: Yuvi <yuvipanda@gmail.com>
|
I also agree with @yuvipanda's suggestion that we should have a "How to" for prompting "did you write this?" That's a tricky and important topic, since I'm sure novice contributors are getting insulted and dismissed left and right as AI when they need support, and support is getting wasted on undisclosed AI. I'd love some suggestions for what to put there. |
I want to just pull out this point because I think it is an important discussion that as many people across our community as possible should participate in. ❓ How do individual members of our community balance the exclusion of people who use LLMs from JupyterHub with the protection of the JupyterHub community? I have thoughts about this but I've run out of time so I'll get them written up and shared tomorrow! |
|
@KirstieJane i've updated my comment to clarify that I am talking about barriers keeping behavior in and out, rather than people. I want to separate "LLM use in ways a, b, c" from "person who uses LLM", because I think conflation of those two (which I accidentally did in my initial draft!) is often the source of conflict too. The same way that CoC keeps out behavior, and one of the enforcement mechanisms is to keep out people (used as a last resort), I believe this policy's goal is to keep out or encourage behavior, rather than specifically 'kinds of people' |
yuvipanda
left a comment
There was a problem hiding this comment.
"AI" is a pretty broad term, with a wide variety of uses. I think this is why the Jellyfin Policy (https://jellyfin.org/docs/general/contributing/llm-policies/) uses quotes around "AI". In 2026, "AI" seems to imply LLMs, because that's where the industry is. But that's not necessarily going to always be the case, and we should re-evaluate as different techniques that may have different characteristics come into play.
The minor suggestions here are to try to find a consistent way to refer to LLMs. Not tied to the specific suggestions (which themselves aren't consistent haha) but wanted to flag this as a step to take.
Based on conversation with the wonderful and ever thoughtful @cboettig
|
I accepted @choldgraf's suggestions, which are all outside the policy itself, just in the summary areas (thank you!). I just pushed one tiny within-the-policy change for the vibes-check from "I wrote this" to "I am the author" based on @mfisher87's suggestions (I think there's still room to resolve ambiguity there, but that can be in a dedicated PR). Thanks everyone for the suggestions and discussion! |
I quite like that language change FWIW. Thanks for the suggestion @mfisher87 |
|
Correction: *except for disclosure, @choldgraf's edits did modify disclosure to be required for AI contributions, but not require declarations on all contributions, which I think is fine. |
Co-authored-by: Chris Holdgraf <choldgraf@gmail.com>
|
🚢 it @minrk ❤️ Any further iterations can come from issues and PRs. I love the "value contributors over contributions". |
|
Awesome work y'all!! Thanks for blazing this trail ❤️ ❤️ ❤️ |
|
Thanks everyone! Given the whirlwind of reviews and small edits, I will merge this one on Monday unless anyone asks me to hold off. |
| - **Responsibility**: You are responsible for any code you submit to JupyterHub's repositories, regardless of whether it was manually written or generated by AI. | ||
| - **Disclosure**: You must disclose whether AI has been used to assist in the development of your pull request. | ||
| - **Code Quality**. We will reject pull requests that we deem being [AI slop](https://en.wikipedia.org/wiki/AI_slop). | ||
| - **Copyright**. We reserve the right to reject any pull requests, AI generated or not, where the copyright is in question. |
There was a problem hiding this comment.
Because closed commercial LLMs do not appropriately attribute their training set, their output is never acceptable.
I think there has to be mention of this hard-line at the top-level if contributors are coming here for a quick glance for how to get started with contributions. I echo @consideRatio 's sentiment that this gets lost in the details further down, and is important enough to highlight since this should have a material effect on a PR workflow and probably the most contentious effect of this policy.
There was a problem hiding this comment.
Because closed commercial LLMs do not appropriately attribute their training set, their output is never acceptable.
I fail to reconcile that statement with accepting any use of Claude Code, Codex, Copilot CLI, or autocomplete from associated companies' models that leads to any character written in the PR process.
I know almost nothing about copyright (especially not in an international context), but I figure with a statement like this retained in the policy, it would be better to clarify the statement implications concretely and discuss if we align and accept them rather than leaving it in for people to interpret differently. For me it reads extremely strict, while I don't pick up in this discussion that its meant to be interpreted that strict.
There was a problem hiding this comment.
I made a suggestion to remove that sentence in #880 (comment)
There was a problem hiding this comment.
while I don't pick up in this discussion that its meant to be interpreted that strict.
fwiw, the existence of this statement matches with my interpretation of this policy and the discussion here so far.
There was a problem hiding this comment.
My perception is influenced mostly by #880 (comment) and the fact that its not being stated at the top of the policy currently.
There was a problem hiding this comment.
This definitely seems important enough to be at the top of the policy. But I also wouldn't complain if this was merged without that change, and would be happy to open a PR.
There was a problem hiding this comment.
I would not interpret this statement @consideRatio as a ban on all AI tool usage. It definitely discourages the "throw it over the wall" and "lacking context of the project" AI slop. For contributors who may be unsure, they can ask or disclose what has been used as a first step which we can guide in a PR template.
I would recommend leaving as written for iteration 1. A separate issue can be created to discuss language improvement for a v2 of the policy.
@minrk I think this PR has reached general consensus. Let's aim for "good/well reasoned" for now over capturing everything. There's been wonderful input from the team across the board. I'm happy to press the green button to merge or leave it in your capable hands.
jnywong
left a comment
There was a problem hiding this comment.
LGTM -- thank you all for such a thoughtful discussion, and thank you @minrk for spearheading. I admit I haven't followed the evolution of the policy wording over the last few weeks, but the version I saw in front of me today was well-reasoned and clear -- and definitely mature enough to put out as a first version! 🚀
Co-authored-by: Jenny Wong <jnywong.pro@gmail.com>
consideRatio
left a comment
There was a problem hiding this comment.
I feel disheartened about this policy in its current form, and lack energy to nudge it much more than this comment.
The policy impacts my a lot emotionally, because I perceive that a PR like jupyterhub/zero-to-jupyterhub-k8s#3883 breaks the policy as perceived by @yuvipanda, and I'm just not emotionally comfortable working that PR further even though not everyone may interpret the policy like @yuvipanda.
At the same time, I'm not willing to adjust my code contribution to a policy that strict, so I find myself sad thinking I'll loose interest in contributing to JupyterHub all together, and reflecting that such outcome may be unexpected given discussions on the idea of "value contributors over contributions".
In our creation of this policy we sought to maximise our interpersonal alignment, compromising where appropriate to reach agreement on an actionable policy.
Did we compromise to reach agreement, or compromise on being in agreement?
There is definitely a ton of compromise here, as there should be. This policy is far more permissive and positive toward AI tools than I would have chosen myself. I certainly appreciate the emotional cost of disagreement on this topic, and I'm super disappointed by the dilution we've gotten so far in order to reach the consensus we have. Clearly that's not fully been reached, though, so further work is required. This process has also drained a huge amount of energy from me, and I find the support for AI tools really saps all of my enthusiasm for contributing to just about any part of Jupyter many days. So what I'd like to see is:
If we can't agree on the latter point, it should be removed. It's hard to express how sad it makes me that this isn't a point of agreement, but since there's a lack of clarity on it for now, I'll accept @consideRatio's suggestion to remove the note about commercial models, since I view it as mostly redundant reinforcement of the policy as commercial tools are particularly egregious violators, not an additional strict rule. |
Community requires compromise. This policy does not represent my values. Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
|
@minrk @consideRatio We have too valuable a group of maintainers for this policy to cause stress and demotivation. There's a lot happening right now with models and AI tools that expose maintainers to unfortunate overload from low value submissions. I've opened #905 to keep the conversation going as the use of commercial and open source models and tools continue to evolve over this year. Let's merge this as is. Thank you Min for deleting the most controversial sentence. I think it is important to have a policy and this has had several months of thoughtful discussion. Unless I hear very strong objections in the next 24 hours, I will go ahead and merge this PR as it stands. |
|
Thank you for all your incredible efforts, @minrk. ec1bb72 makes me incredibly sad and disappointed too :( The AI usage has been extremely discouraging and devaluing for me as well. Thank you for your work in moving this forward, @willingc. I agree that we should move forward, or otherwise we'll be here forever. |
There was a problem hiding this comment.
Hi folks!
I’m sorry I’ve taken so long to get back to commenting on this policy.
A few reflections:
- I truly recognise how emotionally exhausting and demotivating this process is. Thank you to everyone who has moved us forwards. These changes in the world are really tough, and breaking through the tech-industry led marketing hype is its own flavour of gaslighting.
- I personally don’t agree with the policy as it’s written. I’m very concerned that we are limiting the potential contributor pool for JupyterHub. I want very much for this project to be a place that is truly welcoming of diverse perspectives and inclusive of users (who can become contributors!) who come from big tech companies, start ups, academia, government, and civic tech organisations (to name a few!) I think taking such a strong stance against the use of LLMs has the potential to feel like the right / most just action, but the cost in terms of the contributor pipeline could be severe.
- Having said all that, I’m going to dismiss my “request changes” review because I recognise that I have been blocking for too long without being able to constructively participate. I also know how hard many of you (many of us, the team) have worked to find an actionable policy and I appreciate that effort very much.
Looking forward, I’d like for us to consider what types of spaces are appropriate for discussions like these, and what purpose we are seeking to serve with the policy.
- Speaking only for myself, there are perspectives that I feel I am not able to share candidly in a public, search-indexed discussion. That leaves my voice absent from certain discussions when really I have a lot of thoughts, feelings and ideas!!
- But mostly, let’s be honest, I too felt sad, demotivated, and uncomfortable around this discussion…. so my procrastination manifested in avoidance (an all too common outcome for me 😫)
Maybe there’s an opportunity for us to convene with the broader Jupyter community - or just with ourselves - over the next few months to find ways to reinforce a sense of belonging and mutual appreciation, focusing on the humans in our community, and orthogonal to the tools that are being used and developed around us ❤️
See comment above! I thought this dismissal would happen automatically 😅
|
Thanks for all the feedback and review, everyone |
I respect the thoughts @KirstieJane. I'm more optimistic than you about the contributor pipeline. I think that local models will become better (many are quite good now) and that will improve the situation re: copyright questions as well as give an open source alternative for code generation. We're certainly in a "storming and norming" phase of AI tool adoption, and being conservative initially and not being an early adopter of hype isn't an unwise approach. That said, I know that the next year will bring new modes of working with increased transparency and value for humans over technology. I say this recognizing full well that the grant funders are very focused on AI tool usage today. As a data point, we're updating our policy in Python's dev guide where I have commented about focusing on what is best for the project. python/devguide#1778 One interesting voice is Daron Acemoglu, Nobel Prize Economics, about AI tools, global impact, and workers: https://www.youtube.com/watch?v=UXK-LJ1VoDs |
The short summary is:
leaving exactly how tool-use applies to that statement up to individual discretion.
Includes some background on why LLM tools in general are inappropriate for projects like ours. Importantly: it is completely irrelevant how useful or effective they may be.
If adopted, I would also suggest adding an "I wrote this" checkbox with a link to this policy document to Issue and Pull Request templates used across all repos.
I'd also consider copying AGENTS.md from lobsters, but I'm also okay leaving them out as well.