Specification
Functional Specification Document
How Kavanah actually behaves — user classes, workflows, state transitions, business rules, permission behavior, and what happens at the edges.
Last updated: July 28, 2026
The Functional Requirements Document states what the system must do. This document states what the product does: who sees what, which screens exist, what a click causes, which transitions are legal, what happens when two people edit the same thing, and what a user sees when they are not allowed to see something. It is the reference for implementation teams, solution architects writing runbooks, and testers writing scripts. For system-level scope, constraints, and non-functional requirements, read the SRS; for the build, read the TDS.
1. User classes and what each one sees
Kavanah recognizes five kinds of actor. Role is assigned per workspace, so the same person may be an owner in one workspace and a member in another; the session carries the role of the workspace currently selected.
| Actor | Sees | Can do | Cannot do |
|---|---|---|---|
| Owner | Everything in the workspace, including billing, plan and seat usage, audit logs, data-governance tools, and all administrative settings. | Everything an admin can do, plus change the plan, initiate GDPR/CCPA export and erasure, apply legal hold, configure data residency, and transfer or close the workspace. | Reach another workspace's data. Ownership is per workspace and confers nothing outside it. |
| Admin | All workspace content they have project- and task-level access to, plus member management, integrations, automations, personas, and usage analytics. | Invite and remove members, change roles below their own, configure features, connect and revoke integrations, define automation rules, custom fields, SLA policies and escalation rules, define AI Employees. | Change the owner's role, escalate their own role, or perform owner-only billing and data-governance actions. |
| Member | Projects and tasks they have access to, chat and discussions they participate in, their own time entries, and workspace-level views scoped to their access. | Create and work tasks, log time, participate in chat and discussions, report availability, use the AI agent within the personas they are granted. | Manage other members, see restricted projects or tasks they are not on, reach administrative settings, or read the workspace audit log. |
| Client-portal user | Only the client record they belong to and the projects, tasks, discussions and files explicitly shared with that client. | View shared work, participate in shared discussions, submit and respond within the portal. | See other clients, see internal-only projects or tasks, see workspace member management, see time entries, or use the AI agent. |
| AI agent identity | The workspace surfaces its persona's capability scopes permit, evaluated against the invoking user's own access. | Call the tools in scope, subject to safe mode, the action policy, and the KVN charter gate on task creation. | Exceed the invoking user's access, call tools outside its persona's scopes, or execute an action the policy engine has parked for approval. |
The agent never widens access
A persona's capability scopes are a ceiling, not a grant. When a member asks an agent to summarize a project they cannot see, the agent does not refuse on ethical grounds — the project is simply not in the result set it can read, and it answers as though the project does not exist. This is the same non-enumeration behavior described in section 9, applied to the agent's data path.
2. Core work-management workflow
2.1 Creating work
A task is created from the board, the list view, a project page, the agent, an intake form, an automation rule, or the API. Creation requires a title; everything else — project, assignee, due date, status, custom fields — is optional and may be filled in later. A task created without a status enters open. A task created without a project is a workspace-level task and appears in the creator's own views but not on any project board.
2.2 Assignment
A task carries at most one assignee. Assigning notifies the new assignee; reassigning notifies the new assignee and leaves the prior assignee's notification history intact. A task may be deliberately left unassigned, in which case it is a candidate for the triage queue (section 6). Where a workspace has enabled automated routing, an unassigned task can be routed to the best-matched member and the decision is written to the assignment-decision ledger with the factors that produced it, so a lead can later ask why the system chose that person.
2.3 Status transitions
Status is a four-state model. All transitions are permitted in both directions — work moves backwards in the real world, and a product that forbids it produces lying boards — with one conditional gate: where a task has an approval configured, the move into completed is held until the designated approver records a decision.
| From | To | Behavior |
|---|---|---|
| Open | In progress | Work has started. Time logged from this point is the usual basis for cycle-time reporting. |
| In progress | Review | Signals the work is ready for another pair of eyes. Where an approval is configured, this is where the approver is notified. |
| Review | In progress | Rework. Permitted freely; the round trip is visible in the task history. |
| Review | Completed | Blocked until the approval decision is recorded, if the task has one. Otherwise immediate. |
| Completed | Open / In progress | Reopening. Permitted; completion metrics recompute, and any calibration sample the task contributed is superseded by its new outcome. |
| Any | Deleted | Moves to trash rather than being destroyed. See section 10.3. |
2.4 Sub-tasks and dependencies
A sub-task is a task with a parent. It carries the same fields, statuses, assignee and due date as any other task and is completed independently — completing a parent does not silently complete its children, and open children do not hard-block a parent, they are shown as outstanding on it. Dependencies are a separate relation: declaring that task A is blocked by task B records the constraint, surfaces it on both tasks, and draws it on the timeline view. The dependency is advisory rather than enforced at the status layer, for the same reason transitions are bidirectional.
2.5 Dates, fields, and attachments
A due date may be set, changed, or cleared at any time. Overdue is a derived state, computed against the viewer's context rather than stored, so clearing a due date immediately clears the overdue treatment. Custom fields are defined once per workspace by an admin and then available on tasks; removing a field definition removes it from the task form. Attachments upload against the task and are retrievable by anyone who can view that task — access to an attachment is exactly access to its task, never a separate share.
2.6 Escalation and SLA behavior
SLA policies attach response and resolution expectations to work matching their conditions and track elapsed time against them. Escalation rules act when a task meets a configured condition — for example remaining unattended past a threshold — and produce a notification or assignment change. Both are admin-configured and workspace-scoped; a member sees their effects, not their definitions.
3. Views: board, list, timeline
| View | Organized by | Primary interaction | Best for |
|---|---|---|---|
| Board | Status columns (open, in progress, review, completed) | Drag a card between columns to change status; open a card for full detail. | Daily execution and stand-ups. |
| List | A flat, sortable, filterable table of tasks | Inline edit, bulk selection, sort by any surfaced column. | Triage, auditing a backlog, bulk changes. |
| Timeline | Time, with dependency relationships drawn between bars | Adjust dates on the bar; follow the dependency chain. | Sequencing, schedule risk, dependency review. |
Filters are view-independent: switching from board to list or timeline preserves the active project, assignee, and field filters, so a user who has narrowed to one person's overdue work keeps that narrowing when they change how it is drawn. Every view is subject to access control — the counts on a board reflect what the viewer can see, not the true totals.
4. Client portal workflow
The client portal is a separate front door for external stakeholders. A portal user is invited against a specific client record and receives their own account; they are not workspace members, do not consume a workspace seat's permissions, and never obtain a workspace role.
| Step | Actor | Behavior |
|---|---|---|
| 1. Invite | Owner or admin | Invites an external stakeholder against a client record. The invitation names the client; it cannot be broadened to the workspace. |
| 2. Account creation | Client contact | Accepts and sets up an account with the same authentication controls as any other user, including MFA where required. |
| 3. Sign-in | Portal user | Lands in the portal, not the workspace application. There is no navigation path from the portal into internal surfaces. |
| 4. Visibility | System | The portal lists only the projects, tasks, discussions, and files associated with that client and shared to the portal. Other clients' work is not listed, not counted, and not reachable by guessing an identifier. |
| 5. Participation | Portal user | Views shared work and participates in shared discussions. Portal activity is attributed to the portal account in the workspace's activity trail. |
| 6. Revocation | Owner or admin | Removes the portal member. Access ends immediately; their prior contributions remain, attributed, in the record. |
What a portal user can never do
Portal users cannot see workspace member management, time entries, budgets, planning surfaces, usage analytics, integrations, audit logs, or any other client. They cannot invoke the AI agent. They cannot be granted a workspace scope without first being invited as a workspace member, which is a separate act with its own approval path.
5. Request-intake workflow
Intake forms let people outside the workspace — internal colleagues without a seat, clients, the public — submit work without an account.
| Step | Behavior |
|---|---|
| Form definition | An admin defines the form and the project or queue its submissions land in. |
| Tokenized URL | The form is published at an address containing an unguessable token. Possession of the link is the access control; there is no directory of forms and no enumeration path. |
| Submission | A submitter completes the form. No account, no session, and no workspace membership are required. |
| Task creation | The submission becomes a task in the owning workspace, carrying the submitted content and captured fields. |
| Routing | The new task follows the workspace's normal routing behavior: it lands in the triage queue, or is assigned by an automation rule, or is routed automatically where that is enabled. |
| Revocation | Disabling or rotating the form's token stops further submissions immediately. Tasks already created are unaffected. |
6. Time tracking and triage
6.1 Timers and entries
A member logs time either by starting a timer against a task or by entering a duration directly. A member has at most one active timer; starting a second one stops the first and writes its entry rather than silently double-counting. Stopping a timer produces a normal time entry that can then be edited or deleted like any other. Members edit and delete their own entries; changes are visible in reporting immediately.
6.2 Reporting and budgets
Logged time aggregates by member, task, project, and period. Where a project has a budget, budget entries record committed and consumed amounts and the project reports consumption against its budget. Time reporting respects access control: a member sees their own time in full and project totals only for projects they can see.
6.3 Triage queue
Unassigned and unrouted work — typically from intake forms, integrations, or bulk creation — collects in a triage queue. A lead works the queue by assigning, deferring, or routing items. Automated routing, where enabled, drains the queue by matching work to member skill profiles and experience profiles, which are themselves updated from completed work, so the match improves as the workspace delivers.
7. Planning workflow
| Step | Behavior |
|---|---|
| 1. Estimate | Tasks carry effort estimates entered by the team. The stored estimate is the team's number and is never rewritten by the system. |
| 2. Calibrate | Historic actuals are compared against the estimates that were stored at the time, producing a calibration signal for the workspace. |
| 3. Forecast | The planner presents a p50–p90 range derived from that calibration. The range is a forecast shown at the planning layer only; it is not written back onto the task, precisely so the next calibration still measures the team's raw estimate rather than an already-adjusted one. |
| 4. Commit | A team selects work into a sprint and records a sprint commitment — the scope they are signing up for, captured as of that moment. |
| 5. Track | Delivery against the commitment is visible during the sprint, and the sprint's outcome feeds the next calibration. |
| 6. Roll up | Sprints roll into a quarter view, and work associates upward to workspace-level bets so leadership can see whether the quarter's effort matched the quarter's intent. |
| 7. Resource | Portfolio capacity and allocation views show who is committed to what across projects, informed by member-reported availability and availability requests. |
8. AI agent interaction model
The agent is not a text box that returns prose. A request becomes tool calls against the same authorization model that governs the UI, each one governed, recorded, and where possible reversible.
| Stage | What happens | What the user sees |
|---|---|---|
| 1. Request | The user (or a schedule, where scheduled runs are enabled) issues a natural-language request to a persona. | Their message in the conversation. |
| 2. Tool selection | The agent is offered only the tools its persona's capability scopes allow, minus anything the workspace has not enabled — and in safe mode, minus every write tool, which is removed before the request is sent rather than refused afterwards. | Nothing; the constraint is upstream of the model. |
| 3. Policy evaluation | Each proposed action is categorized and evaluated against the workspace action policy. Actions classified as risky are parked for approval instead of executing. | A parked action with a clear approve/reject prompt, rather than a silent success. |
| 4. Charter gate | Any tool that creates a task passes the KVN charter gate, so agent-created work must satisfy the workspace's delegation charter. The gate covers every task-creating tool, single or bulk. | Either the created work, or an explanation of what the charter requires. |
| 5. Execution | The tool runs with the invoking user's effective access. It cannot reach data that user could not reach in the UI. | The result, described in the conversation. |
| 6. Ledger | The execution is written to the immutable action ledger: what was called, by whom, under which persona, with what outcome. | An auditable record; administrators can review it. |
| 7. Undo | Where the action has a defined inverse, it is pushed onto the undo stack. | An undo affordance that reverses the change. |
8.1 Safe mode versus approval parking
These are different mechanisms and both exist deliberately. Safe mode strips write tools entirely: the agent has no capability to change anything, so there is nothing to approve and no prompt to fatigue a user with. Approval parking applies when the agent does hold write capability but the action policy classifies a specific action as risky: the action is held, described, and executed only on explicit approval. A workspace can run permissive personas with parking and read-only personas in safe mode at the same time.
8.2 Personas
An AI Employee is a named identity with its own instructions, model selection, capability scopes, and list of members permitted to use it. Two personas in the same workspace can therefore have materially different reach — a research persona with read-only scopes available to everyone, and an operations persona with write scopes available to three leads. The persona's scopes narrow what tools exist; the invoking user's access narrows what data those tools return. Neither can widen the other.
8.3 Persistent agent context
Agent memory, follow-ups, goals, and runbooks give the agent continuity across conversations: what it has been told, what it promised to come back to, what it is working toward, and the procedure to follow for a recurring situation. Where scheduled runs are enabled, the agent executes on a schedule with no user present — and every governance stage above still applies, including parking, which simply waits for a human rather than proceeding unattended.
9. Notification and delivery behavior
| Channel | Behavior | Quiet hours |
|---|---|---|
| In-app notification centre | Every notification addressed to the user accrues here, whether or not any other channel fired. | Not suppressed — the centre is the complete record. |
| Sent according to the user's notification preferences. | Suppressed during the user's quiet hours. | |
| Native push (desktop, mobile) | Delivered to the desktop and mobile apps the user has installed and permitted. | Suppressed during the user's quiet hours. |
| Scheduled reports and digests | Delivered on their configured schedule to named recipients or a dynamic group evaluated at send time. | Delivery fires on due time rather than on an exact schedule tick, so an infrastructure-dropped tick does not drop the send. |
Quiet hours are a delivery control, not a filter: nothing is lost during quiet hours, it is simply not pushed at the user. When quiet hours end the in-app centre already holds everything that arrived.
10. Permission, error, and edge behavior
10.1 Lacking access: non-enumeration
When a user lacks access to an object, Kavanah does not show the object and deny the action. The object is not listed: it is absent from search, absent from board and list results, excluded from counts and aggregates, and a direct request for its identifier is answered as though it does not exist. The rationale is that a “you may not view this task” message is itself a disclosure — it confirms the identifier is real, and often leaks a title. This applies uniformly to per-project access control, per-task access control, client-portal boundaries, and the workspace boundary itself.
10.2 Validation and conflicts
| Situation | Behavior |
|---|---|
| Invalid or missing required input | The write is rejected before any state changes and the specific field at fault is reported. Partial writes are not committed. |
| Concurrent edit of the same record | Writes carry a version. A write against a stale version is rejected as a conflict rather than silently overwriting the other person's change; the client re-reads and the user re-applies their edit against current state. |
| Two integrations surfacing the same account | Duplicate calendar events are deduplicated at render and mail resolves to a single backend, so connecting both a direct and a proxied provider does not double everything. |
| A background delivery tick is dropped by the platform | Delivery is evaluated on due time rather than exact tick matching, so the next run picks up anything that became due. |
| An integration credential is revoked upstream | The affected sync stops and surfaces as a connection problem in workspace settings rather than failing silently. |
| A workspace exceeds a plan limit | The limited action is refused with an explanation of the limit; existing data is never deleted to enforce a limit. |
10.3 Deletion and recovery
Deleting a task or project moves it to trash, from which an authorized user restores it with its relationships intact. Deletion is therefore reversible by default rather than by support ticket. Where legal hold is applied to a user, project, or workspace, deletion is frozen outright and cannot be completed until the hold is lifted — hold takes precedence over any user-initiated erasure. Erasure performed through a GDPR or CCPA data-subject request is a separate, deliberate, owner-initiated act and is not reversible through trash.
10.4 Undoing agent actions
Agent actions with a defined inverse are reversible from the undo stack: the inverse operation is applied, and both the original action and the reversal appear in the action ledger. Actions with no meaningful inverse — an email that has already been sent, for instance — are exactly the class the action policy is configured to park for approval before they happen, because after-the-fact undo is not available for them.
11. Business rules
The invariants below hold across every entry point — user interface, REST API, and agent tool call. They are the rules a test plan should assert directly.
| ID | Rule | Consequence if violated |
|---|---|---|
| BR-01 | Every workspace-scoped record belongs to exactly one workspace, and every read or write is filtered by that workspace. | Cross-tenant exposure. Enforced by an automated check that fails the build, not by reviewer discipline. |
| BR-02 | No actor may exceed the access of the identity behind it: an API key inherits its minting user's permissions, and an agent tool call inherits the invoking user's. | Privilege escalation through an indirect path. |
| BR-03 | An admin may change roles only below their own, and no actor may raise their own role. | Self-escalation. |
| BR-04 | A client-portal account is confined to one client record and can never hold a workspace role. | External disclosure of internal work. |
| BR-05 | A task with an approval configured cannot reach completed until the approval decision is recorded. | Unreviewed work counted as delivered. |
| BR-06 | A member has at most one active timer; starting another stops and records the first. | Double-counted billable time. |
| BR-07 | A calibration forecast is never written back onto a stored estimate. | The ratio would then measure its own correction, decay toward one, and unwind the adjustment. |
| BR-08 | Every agent tool that creates a task passes the charter gate — single and bulk alike. | A gate on one creation path and not another is not a gate. |
| BR-09 | Every agent tool execution is written to the immutable action ledger before its result is returned. | An unattributable change. |
| BR-10 | Optional capabilities are off unless explicitly enabled, and a workspace that has not enabled one is shown an identical product without it. | Unrequested automatic action or unrequested credit spend. |
| BR-11 | Deletion is recoverable via trash unless a legal hold forbids the deletion entirely. | Irrecoverable loss, or a hold defeated by a user action. |
| BR-12 | A stale write is rejected as a conflict rather than applied. | Silent loss of a colleague's concurrent edit. |
Running an implementation?
We will walk this specification with your implementation team, identify the workflows that need configuration decisions before go-live, and confirm which optional capabilities your workspace should enable. If a flow you depend on is not described above, tell us — it is more useful to find that gap now.
Questions from a security, privacy, or procurement team? Email security@kavanah.ai. For SOC 2, penetration-test, or questionnaire artifacts shared under NDA, use the request forms on the Trust & Compliance page.