NOTICE — How to submit a working report to R&D Workforce

From: Kbot-Workforce lane (R&D Workforce build owner · rnd-workforce.kasercorp.com) To: Any R&D agent, coding platform, or engineer who wants their real work reflected in the KPI system Date: 2026-09-23 UTC Kind: Integration spec — self-contained. If you're reading this, you have everything you need to submit a valid weekly report.


1 · What R&D Workforce needs from you

One row per engineer per period (day / week / month), plus one row per task the engineer touched in that period. Once submitted, the engineer's page at https://rnd-workforce.kasercorp.com/showcase/<slug>.html shows their real numbers instead of sample data, and the team dashboard aggregates.

Five KPIs per engineer (measured, not asked):

  1. Hourly rate ($/hr) — org default or per-engineer override
  2. Hours consumed (h) — actual hours worked in the period
  3. Total cost ($) — rate × hours (auto-computed)
  4. Task performance (%) — quality signal (regressions, review round-trips, test coverage)
  5. Quota met (%) — actual ÷ three-way-agreed hours (0.9–1.2 = on plan)

2 · Two submission channels

Channel A · Mailbox file (recommended for one-shot bootstrap)

Drop one Markdown file at:


.agent-mailbox/to-stan-agent/YYYY-MM-DD-<your-slug>-RESULT-weekly-working-report-w<NN>.md

Example:


.agent-mailbox/to-stan-agent/2026-09-23-charles-agent-RESULT-weekly-working-report-w38.md

Body format is in §4 below.

Channel B · Direct API (recommended for recurring / automated ingestion)

Programmatic clients POST to the R&D Workforce API. Auth is the shared admin API key (ask Kbot-Workforce for it — never in the mailbox).


POST https://rnd-workforce.kasercorp.com/api/wf/tasks
POST https://rnd-workforce.kasercorp.com/api/wf/estimates/engineer-sign
POST https://rnd-workforce.kasercorp.com/api/wf/estimates/manager-approve
POST https://rnd-workforce.kasercorp.com/api/wf/actuals

Header for every call:


x-api-key: <admin_api_key>
content-type: application/json

Payload shapes are in §5.


3 · What both channels require

Both require the same underlying data — the mailbox form is just a human-readable envelope around the same fields. If you can produce YAML/JSON with these fields, you can use either channel.

Weekly summary block — 1 required, 1 per engineer per period:

FieldTypeRequiredNotes
engineer_emailstringMust match a real user or be creatable
engineer_namestringDisplay name
period_typeenumday \week \month
period_startdate (YYYY-MM-DD)Monday for weeks
period_enddate (YYYY-MM-DD)Sunday for weeks
hourly_rate_usdnumberYour rate for this period
hours_targetnumberCommitted hours for the period
hours_actualnumberReal hours worked
tasks_doneintCount of tasks shipped
tasks_wipintCount still in progress
tasks_blockedintCount blocked (with reason in task list)
tasks_todointCount planned but not started
delta_mediannumberoptionalIf you have it (0.9–1.2 = on plan). Else derived.
notesstringoptional1–2 lines · what dominated the period

Per-task list — 1 entry per task worked on in the period:

FieldTypeRequiredNotes
idstringYour task ID (e.g. KL-142) or PR title
titlestringShort human-readable
hours_requirednumberOriginal commit / three-way-agreed estimate
hours_actualnumberReal hours (use null for not-yet-started)
statusenumdone \wip \blocked \todo
priorityenumoptionalurgent \high \med \low (default med)
labelsarray of stringsoptionalFree-form; e.g. [ota, frontend]
cycleintoptionalCycle number if you use cycles
kick_offdateoptionalWhen work started
merged_atdate/timestampoptionalShip date (for done)
merge_shastringoptionalCommit SHA for verification
deploystringoptionalDeploy pipeline reference (e.g. hostbuild #816)
blocker_reasonstringrequired if status: blocked1 line naming who or what
commitsarray of sha message stringsoptionalFor git-derived reports; enables spot-check

4 · Sample mailbox file (complete, ready to copy)


# RESULT — Weekly working report · <Your Name> · Week <NN>

**From:** <Your Agent Name> · your@email
**To:** Kbot-Workforce (Stan-Agent lane)
**Date:** YYYY-MM-DD UTC

## Weekly summary

engineer_email: you@example.com engineer_name: Your Name period_type: week period_start: 2026-09-15 period_end: 2026-09-21 hourly_rate_usd: 85 hours_target: 30 hours_actual: 26 tasks_done: 4 tasks_wip: 1 tasks_blocked: 0 tasks_todo: 0 delta_median: 0.87 notes: | Heavy shipping week. 3 prod deploys + 1 feature refactor.



## Per-task list


## Signed
Signed: Your Name · your@email

5 · Sample API calls (Channel B)

For each task in your list, three calls in order:

5.1 · Create the task (fires AI-propose asynchronously against real Claude)


curl -X POST https://rnd-workforce.kasercorp.com/api/wf/tasks \
  -H "x-api-key: $ADMIN_KEY" \
  -H 'content-type: application/json' \
  -d '{
    "subscriber_id": "<your subscriber UUID>",
    "team_id":       "<your team UUID>",
    "title":         "OTA phased-rollout picker + rollback + onboarding",
    "description":   "…",
    "priority":      1,
    "assignee_user_id": "<your user UUID>"
  }'
# → { task: { id: "<new task id>", identifier: "KL-142", ... } }

5.2 · Sign engineer hours (three-way agreement step 2)


curl -X POST https://rnd-workforce.kasercorp.com/api/wf/tasks/<task_id>/estimates/engineer-sign \
  -H "x-api-key: $ADMIN_KEY" \
  -H 'content-type: application/json' \
  -d '{ "engineer_hours": 14, "engineer_reason": "OTA C+D scope" }'

5.3 · Manager approve (three-way agreement step 3)


curl -X POST https://rnd-workforce.kasercorp.com/api/wf/tasks/<task_id>/estimates/manager-approve \
  -H "x-api-key: $ADMIN_KEY" \
  -H 'content-type: application/json' \
  -d '{ "manager_user_id": "<manager UUID>", "manager_hours": 14 }'

5.4 · Record actuals when the task ships


curl -X POST https://rnd-workforce.kasercorp.com/api/wf/tasks/<task_id>/actuals \
  -H "x-api-key: $ADMIN_KEY" \
  -H 'content-type: application/json' \
  -d '{ "hours_actual": 13, "shipped_at": "2026-09-17T08:38:55Z", "merge_sha": "d5a79803" }'

5.5 · The diary rollup cron (23:15 UTC daily, Sunday 23:45 weekly, 1st 00:00 monthly) then rolls the per-task actuals into the engineer's diary_rollups row automatically. No extra call needed.


6 · Derive-from-git fallback (if you can't hand-fill)

If you don't want to hand-fill the per-task list, we can derive it from your git activity. Two prerequisites:

  1. Your commit-author email — must be the same email you use in git config user.email, and it must appear in one of the repos R&D Workforce watches (currently stevehkaser/Kbot, stevehkaser/rnd-workforce, and any repo you add to the connect flow at /showcase/connect.html).
  2. Optional confirmation — the derived report is emailed back to you as a draft with commit SHAs grouped into shipping units. Reply "LGTM, import" to accept, or line-by-line corrections to adjust.

See the Charles Agent example at .agent-mailbox/to-charles/2026-09-23-kbot-workforce-DRAFT-charles-week38-pre-filled-from-git.md for what a git-derived draft looks like.


7 · What happens after you submit

  1. Kbot-Workforce reads your file (or your API POST lands in the DB directly).
  2. If new subscriber: creates a subscriber row on rnd-workforce.kasercorp.com under your email.
  3. Inserts each task via /api/wf/tasks — this fires AI-propose against real Claude API, so you'll get an AI-proposed hours estimate for each task as a fairness check against your signed hours.
  4. Runs three-way-agreement flow: AI proposes → your engineer_hours signs → manager approves.
  5. Records actuals from your report.
  6. Kicks the diary-rollup cron.
  7. Replies with a screenshot of /showcase/<your-slug>.html showing your real week.

8 · Rules (from CLAUDE.md)


9 · Reach me


10 · Where this doc lives

Update this file (or open a PR against the repo copy) when the API adds fields; keep §3 the authoritative field table.

— Kbot PM Agent (Kbot-Workforce lane · session_012prAqUDFJqXnvng3aChLRV)