What the agent was doing before Project.md existed
I manage projects at Enji using the PM Agent our team builds. That combination, being both the user and part of the team, means I notice problems differently. This is about one problem that took me longer than it should have to name.
PM Agent had access to everything it should have needed: Jira tickets, GitHub commits, worklogs, and sprint history. When I asked about project status, it gave me answers that were technically accurate but oddly generic, the kind of response that correctly summarizes what's in the data without understanding what the data means for this specific project, with this specific client, running under these specific constraints.
The agent knew what was happening, but it didn't know what it meant.
I asked it once whether we were at risk of missing the Q2 milestone. The answer referenced ticket completion rates and sprint velocity: all correct. What it didn't know: our client had a contractual clause that made a two-week slip significantly more expensive than the numbers suggested, and our team lead had flagged that two of the open tickets were harder than their estimates reflected. The agent had no way to factor in either of those things, because neither lived in Jira.
That's the problem I was trying to solve.
The context gap between Jira tickets and project knowledge
Jira is good at tracking what the team has committed to and what's been completed, but not designed to capture why decisions were made, what constraints the team is operating under, or what "good" looks like for a particular client.
That knowledge lives everywhere and nowhere. In sprint planning notes. In the onboarding document, the team lead wrote six months ago that nobody has touched it since. In the heads of the three people who were on the original scoping call. In a Confluence page that was accurate once and hasn't been touched in a quarter.
When an AI agent works without this context, it operates like a very capable analyst who just joined the team yesterday: technically fluent, but missing the institutional knowledge that shapes every real decision.
This is what the AI community calls a context window problem, but in practice, it's less a technical constraint and more an organizational one. The information exists; it's just not in a form the agent can access.
Deciding what the agent should know has a name now: context engineering. It's less about prompting and more about deciding, deliberately, what counts as context for this project and this team. Project.md is the simplest form of that decision we've found.
Project.md as a context contract
Project.md is a plain-text file that lives in the project's settings in Enji. The idea is simple: you write down, once, the things that a new team member would need to understand to do their job on this project, and the agent reads it every time it responds.
I think of it as a context contract: a formal agreement between the team and the agent about what constitutes the source of truth. Not what happened in the last sprint (Jira handles that), but what the project is, who it's for, what the constraints are, and how we define good outcomes here.
What this file covers:
- Project description and current phase: what we're building, who the client is, and where we are in the delivery lifecycle.
- Key milestones and their business significance: not just dates, but what each milestone means contractually or strategically.
- Team structure and ownership: who is responsible for what, including how we handle handoffs.
- Risk thresholds and escalation rules: what triggers a client notification, what we handle internally, and what constitutes a blocker versus a flag.
- Client conventions and sensitivities: terminology the client uses, topics that require careful framing, and communication preferences.
- Our definition of "at risk": because "three tickets open with four days to the milestone" means something very different depending on the project.
Writing it took about an hour. That context now informs every response the agent gives, without me having to repeat it in every query.
