Skip to content

Rewrite the design docs for the template-app positioning: docs/product/positioning.md, docs/roadmap.md, README top section (docs only) #135

Closed

Description

@os-warren

维护者速读

按新定位重写三份设计文档:docs/product/positioning.md(定位)、docs/roadmap.md(路线图)、README.md 顶部。核心变化:Duly 不再写成「要卖到全球的独立产品」,而是「ObjectStack 的标准模板应用 —— 用来替代 Excel + 微信群 管周期性履职」。要写清三件事:它是什么、它不是什么(不是 QHSE 套件、不做考核、不做工作日历、不接即时通工具、不直销)、从哪里开始(装模板 → 选目录包 → 换成自己的表)。与 EHS 套件的关系写成「分层并存」。只改文档,不改代码。

Why

Positioning ruling in epic #127 (maintainer, 2026-10-26). The current design docs are good but product-bet shaped: positioning.md has a Buyer and a Pricing shape section; roadmap.md titles M4 "Sellable as a product, worldwide"; README's docs list calls the roadmap "milestones M0–M4" and the positioning section never says the word template. None of them mention catalog packs, the EHS layering stance, or the parked items. A template app is judged by its first screen of README and its positioning page.

Files (the whole surface; stop and report on any breach)

  1. docs/product/positioning.md — rewrite in place, keeping the parts that still hold (Category, the five-point problem statement, "What we will not build", "Why ObjectStack", the positioning statement). Changes:
    • New section after Category: Form — Duly is the standard ObjectStack template app and reference implementation: install it, load your catalog (or pick a shipped pack), run it without us. The competitor it displaces is the spreadsheet plus the chat group, not any suite.
    • New section: Beside EHS/QHSE suites, not against them — the suite remains the system of record for incidents, chemicals, permits and environmental data; Duly is the duty layer owned by the operating roles themselves. State what flows which way at most in two sentences; no integration promises.
    • "Who it is for": keep the verticals; replace Buyer with Who adopts it (the operating manager who owns the spreadsheet today; the platform team that wants a reference app).
    • Remove the "Pricing shape" section entirely. Do not replace it with another commercial section.
    • Extend "What we will not build" with the parked items, each with its one-line reason: QHSE checklists (phase 2), supervision and scoring (phase 3), a work calendar, per-customer IM connectors, direct sales. Quote the ruling's wording from the epic body where it exists.
    • Rewrite the positioning statement to the template framing. Chinese version of the statement directly beneath the English one.
  2. docs/roadmap.md — keep the milestone structure (it is referenced by README and by labels). Retitle M4 to the epic's gate wording ("Install it, load your catalog, run it without us"), replace its bullet list with the epic's section-B items by title (no issue numbers in prose), add a Parked section quoting the ruling verbatim for the five parked items, and keep "Explicitly out of scope". M3 stays as written.
  3. README.md — the top section only (lines before "## What makes it different"): add the one-sentence template framing, the spreadsheet-plus-chat-group sentence, and a three-step 60-second path (clone → pnpm demo:zh → replace the catalog with your own). Chinese paragraph first, English mirror beneath for this section only. Fix the docs-list line that reads "milestones M0–M4" to describe the roadmap by its gate. Do not touch the demo tables, the Ardenline/安岭 rules, or any technical section.
  4. docs/product/design-principles.md and docs/product/data-model.md — read, do not edit, unless a sentence directly contradicts the new positioning; if so, change that sentence only and list it in the PR body.

Premise (verify first; report a fork if false)

Acceptance

  • pnpm validate && pnpm typecheck && pnpm test && pnpm build unaffected (no code touched); any markdown lint the repo runs passes.
  • A reader with no prior context can answer from README plus positioning.md alone: what it is, what form it takes, what it is not, how to start, how it relates to an EHS suite.
  • No file outside README.md and docs/** touched. No code, no seeds, no translations, no screenshots.
  • PR body carries a 中文 maintainer speed-read quoting the new positioning statement as written, for sign-off.
  • No marketing adjectives, no customer names, no "industry-first", no pricing.

Dispatch notes

Activity

  1. changed the title [-]Rewrite README positioning, roadmap and docs/ index for the template-app positioning (docs only)[/-] [+]Rewrite the design docs for the template-app positioning: docs/product/positioning.md, docs/roadmap.md, README top section (docs only)[/+] on Oct 26, 2026
  2. self-assigned this
    on Oct 26, 2026
  3. os-warren commented on Oct 26, 2026

    @os-warren
    CollaboratorAuthor
    Claim: PM loop round 1 (epic #127 positioning docs)
    Session: `session_01SqkTcrxUFci7nqXdbBSe2p`
    Account: `os-warren`
    Branch: `claude/issue-135-positioning-docs`
    Worktree: `duly-issue-135`
    Domain: n/a (duly has no domain lanes; area:platform-ops)
    Seat: epic:#127 PM
    File surface: `README.md` (top section only), `docs/product/positioning.md`, `docs/roadmap.md`; read-only `docs/product/design-principles.md`, `docs/product/data-model.md` (stop on breach; explain in the report)
    Container & model: S docs card, mode:subagent, model: fable (maintainer instruction in this session: "设计文档用fable"), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none (no comments before this claim)
    Premise: holds (files verified present on main 74342a1; epic body re-read this round)
    Serial constraints cleared: none in flight on these files; #132 (pm:ready, not dispatched) owns docs/getting-started.md and the checklist, disjoint by file
    Resume-from: none
    

    Dispatch scope note: per the maintainer's instruction in this session ("你只负责创建任务,后续有车道经理负责派发" / "如果有设计文档需要修改你可以派发"), this seat dispatches only this design-document card. The code cards in the epic (#128, #129, #132, #133, #134) stay pm:ready for the lane manager.


    Generated by Claude Code

  4. os-warren commented on Oct 26, 2026

    @os-warren
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 135,
      "status": "done",
      "branch": "claude/issue-135-positioning-docs",
      "pr": "https://github.com/objectstack-ai/duly/pull/138",
      "session": "session_01SqkTcrxUFci7nqXdbBSe2p",
      "premise_still_valid": true,
      "summary": "Rewrote docs/product/positioning.md (new Form and Beside-EHS/QHSE sections, Buyer replaced by Who adopts it, Pricing shape removed, five parked items added to What we will not build quoting the epic ruling, positioning statement rewritten in the template framing with a Chinese version beneath), docs/roadmap.md (M4 retitled to its gate, bullets replaced by the epic section-B items by title, Parked section quoting the ruling verbatim, M0-M3 and out-of-scope unchanged) and the README top section (Chinese first, English mirror, template framing, spreadsheet-plus-chat-group sentence, three-step sixty-second path; docs-list line describes the roadmap by its gate). One sentence in docs/product/data-model.md changed because it said Duly is sold worldwide; design-principles.md read, not edited. Docs only; commit 8bdc28c on a draft PR.",
      "tests": "No code touched. Under the shared verification lock on commit 8bdc28c: pnpm validate -> Validation passed; pnpm typecheck -> tsc --noEmit silent; pnpm test -> Test Files 35 passed (35), Tests 885 passed (885); pnpm build -> Build complete, artifact 227.5 KB. Lock VERDICT command-exit 0, held 49s, waited 0s (shared-box seconds). No ablation: no tested behaviour changed. test/demo-script.test.ts pins that README contains pnpm demo:zh; three occurrences after the edit.",
      "gates": "validate: pass (exit 0, Validation passed) · typecheck: pass (exit 0) · test: pass (exit 0, 35/35 files, 885/885 tests) · build: pass (exit 0, Build complete). All four exit codes captured as the chained command's exit under os-verify-lock.sh, before any pipe. Repo runs no markdown lint. CI (one workflow, same four steps) not yet read on the PR at report time: in_progress.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; this repo has no dogfood suite",
      "mcp_calls": "7 — issue_read x4 (issue 135 get + comments, epic 127 get + comments), create_pull_request x1 (write: the draft PR, as the dispatch directed; gh is unavailable in this container and the duly repo has no scripts/pm write tools), pull_request_read x1 (PR body read-back), add_issue_comment x1 (write: this report comment, per the os-dev GitHub-first report contract)",
      "api_writes": "0 — no REST proxy writes; git push x1 (not a REST write)",
      "files_touched": ["README.md", "docs/product/positioning.md", "docs/roadmap.md", "docs/product/data-model.md"],
      "open_questions": [
        {
          "question": "The dispatch note said to prefer posting no comments while the os-dev contract requires the os-dev-report comment on the issue; the contract wins by its own conflict rule, so this comment was posted. Confirm that is the wanted shape for docs cards dispatched from the epic seat.",
          "options": ["A keep GitHub-first report comments on every card", "B dispatch note may waive the comment for S docs cards, with the handback JSON as the only report"],
          "recommendation": "A, because the comment is what survives a dead subagent; the handback does not."
        },
        {
          "question": "roadmap M4 keeps one sentence recording what landed under the old title (i18n coverage gate, standard Import, bilingual demo) before the section-B items; the issue said replace the bullet list, which the sentence does not contradict but does extend.",
          "options": ["A keep the sentence", "B delete it so M4 is exactly the section-B list"],
          "recommendation": "A, because dropping it erases three delivered capabilities from the only roadmap readers have."
        }
      ],
      "out_of_scope_findings": [
        "class: none of a|b|c (code comment) · reach: none · evidence: objectstack.config.ts line 161 comment still reads 'Duly is sold worldwide; English is the source language…', outside this card's file surface (README.md and docs/** only) · carrier: whoever next edits that comment block · noted, not filed · dedupe words: sold worldwide, objectstack.config.ts, source language comment"
      ]
    }

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions