Skip to content

Make the repository template-shaped: empty first boot, template-readiness checklist, README and getting-started for a reader with their own spreadsheet #132

Closed

Description

@os-warren

Part of #127 (B — packaged as a template).

Why

create-objectstack will copy this repository as a starting point. What it copies must read as your app on first boot, not as the Ardenline demo or as one customer's project: empty on pnpm dev, demo data opt-in, no customer vocabulary in the source, and a README that gets a reader from "I have an Excel list of duties" to "my people see their week" without us.

What "done" is

  1. A template-readiness checklist committed as docs/template-checklist.md, each item measured on a fresh clone (git clone → pnpm install → pnpm dev): boots empty with the dev admin; no demo rows unless pnpm demo; .objectstack/ and dist/ ignored; no file references Ardenline / 安岭 / a customer outside src/data/demo-* and samples/; package.json name/description/version suitable for a scaffold (version 0.1.0 stays); licence headers present.
  2. README restructured for a template reader, in this order: what it is (two paragraphs, new positioning — the duty layer owned by operating roles; layered beside an EHS suite, not replacing it); quick start (empty); load your own catalog (the import walkthrough, from the reader's own spreadsheet, linking samples/); try the demo (pnpm demo / pnpm demo:zh); customise (phrases, thresholds, catalog — link the configurability matrix when it lands); verify; layout; docs. The "What makes it different" table stays.
  3. A docs/getting-started.md that is the ten-minute path: install → sign in → import samples/business-units.csv, people.csv, catalog-items.csv, duties.csv → confirm & approve one duty → run the dispatcher (name the command) → open My week. Every step has the command or the click, and a screenshot where the walkthrough already has one.
  4. Four gates green; the checklist's measurements pasted into the PR.

Not in this card

The create-objectstack side (filed in objectstack-ai/objectstack); the catalog packs (separate cards); positioning.md (separate docs card).

Activity

  1. os-warren commented on Oct 26, 2026

    @os-warren
    CollaboratorAuthor

    Acceptance note folded in from PR #138 (docs rewrite for #135): the comment block at objectstack.config.ts line 161 still reads "Duly is sold worldwide; English is the source language…". It is a code comment with no runtime reach, but it is sales framing in the template's entry file, and this card owns "no customer naming / template-shaped repo". When you touch the repo for this card, reword that comment to the template framing (English is the source language because the template is installed wherever its users are). No new card; one sentence.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_011HyoSXGRy6L13mYq1Hp4n1
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-oaj047 (platform-assigned card-thread branch; the card thread may push only this branch)
    Worktree: duly-issue-132
    Domain: n/a — objectstack-ai/duly is a single-lane app repo (no domain:*); the duly lane seat does first-touch itself
    Seat: repo:duly#1
    File surface: README.md, docs/template-checklist.md (new), docs/getting-started.md (new), objectstack.config.ts (the one comment at line 161), package.json metadata fields (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (hand-derived: dispatch-gates answers only objectstack's tree), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6409421581
    Premise: holds
    Serial constraints cleared: none in flight; scripts/demo.mjs and src/data/** are excluded from this surface because #131 and #134 queue behind this card on them

    Triage (first touch, 2026-10-26T06:37Z): lands in objectstack-ai/duly; rationale: epic #127 B item (template-shaped repo), maintainer ruling quoted in the epic body; type Task; ungraded (this repo has no priority:p2 label yet, noted for the round report). Premise readings on origin/main 004380e: objectstack.config.ts:161 still reads "Duly is sold worldwide"; Ardenline/安岭 references outside src/data/demo-* and samples/ remain in README.md, docs/import/walkthrough.md, test/seed-locale.test.ts.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 132,
      "status": "done",
      "branch": "claude/project-thread-oaj047",
      "pr": "https://github.com/objectstack-ai/duly/pull/141",
      "session": "session_014DNHYWgBoc2X4mq1PuFCuk",
      "premise_still_valid": true,
      "summary": "README reordered for a template reader (positioning, what makes it different, empty quick start, load your own catalog, try the demo, customise, verify, layout, docs; demo company no longer named), new docs/getting-started.md (the ten-minute path, click + command per step, walk screenshots reused) and docs/template-checklist.md (7 items, each measured on a fresh clone of 004380e), config i18n comment reworded per comment 6409421581, package.json description + keywords. Hypothesis 1 held (pnpm dev boots empty, admin sign-in 200, only pnpm demo seeds), so no seed work; hypothesis 2 held. Two checklist rows are measured red and left red: item 4 (37 lines of customer sales-deck references in 11 files outside the file surface) and item 7 (no run-now for duly_dispatch on 17.3.0; an imported duty is unreadable by its own owner because readScope own keys on owner_id). The card's 'run the dispatcher (name the command)' step has no command to name on 17.3.0; getting-started says so instead of inventing one. Card assignee was empty; PR assignee set to os-warren per the claim's Account line.",
      "tests": "Docs/metadata-comment change, no tested behaviour changed, no ablation. Fresh-clone measurements (scratch clone at 004380e): pnpm install --frozen-lockfile exit 0; pnpm dev: sign-in 200 Dev Admin, sys_user 1, units/catalog/duties/tasks/assignments/log 0/0/0/0/0/0; pnpm demo: 13/6/20/31/172/2/15, sign-in 200; git status --ignored only .objectstack/ dist/ node_modules/. Ten-minute path on pnpm dev: business units 6 created, import-users 12 created (12 email invites), catalog 21, duties 19 (18 to_confirm, 1 to_review), PATCH to_review 200, approved 200; owner reset-password 200, sign-in 200, duly_task/duly_duty 403 until duly_member bound, then duly_duty total 0 (self-created: 1). pnpm test at head 1d7ffaf: Test Files 35 passed (35), Tests 885 passed (885).",
      "gates": "Local, head 1d7ffaf, each through os-verify-lock.sh with output redirected before capture: pnpm validate VERDICT command-exit 0 (Validation passed); pnpm typecheck VERDICT command-exit 0; pnpm test VERDICT command-exit 0; pnpm build VERDICT command-exit 0. dispatch-gates.mjs not used: it answers only the objectstack tree; duly's families hand-derived from .github/workflows/ci.yml = exactly these four. CI on PR #141: in_progress at report time, not awaited.",
      "dogfood_battery": "n/a — duly repo; no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — mcp__github__issue_read x5 (get #132, get_comments #132 twice, get #127, get_sub_issues #127); no write tools",
      "api_writes": "2 — (1) relay pr_create via fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/dispatches, run 40282860438 success, created objectstack-ai/duly#141 draft with assignee os-warren, read-back identical 6265/6265 bytes; (2) this os-dev-report comment via post-stamped.mjs on objectstack-ai/duly#132. git push not counted.",
      "open_questions": [
        {
          "question": "Getting-started step 7: how should a template reader dispatch on demand while the platform has no run-now for jobs?",
          "options": [
            "A — file the platform gap upstream and document the nightly wait (what this PR ships)",
            "B — add a declared, labelled stopgap in duly (an admin-only Dispatch now action whose handler calls runDispatch), to be deleted when the platform door lands"
          ],
          "recommendation": "A, because AGENTS.md rule 9 and epic #127 section C both say the template ships with gaps filed and documented, not worked around; B is a new handler on the product's most critical path."
        },
        {
          "question": "Imported duties and tasks are invisible to their own owner (readScope own resolves owner_id, Duly's owner is a separate field). Which fix direction?",
          "options": [
            "A — platform: let an object declare which user field is its ownership field for scope resolution (upstream card)",
            "B — duly: a hook that keeps owner_id equal to owner on duly_duty and duly_task (security-boundary change in the app)",
            "C — document only, and make every owner create their own duties"
          ],
          "recommendation": "A filed upstream, with B as a maintainer decision card under epic #127's rule (it changes a security boundary); C defeats the import path the template is built around. Likely belongs beside #130."
        }
      ],
      "out_of_scope_findings": [
        "class: a · reach: GET /api/v1/data/duly_duty as an imported duty's owner with duly_member bound answers total 0 on pnpm dev (17.3.0); the same person's self-created duty answers total 1; imported row owner_id = the importing admin · evidence: docs/template-checklist.md item 7, PR #141 Acceptance notes · lands: duly (decision) + objectstack (ownership-field scope) · dedupe words: readScope own owner_id, imported record owner, owner field vs owner_id, My week empty member",
        "class: a · reach: no public door triggers a job on demand on @objectstack 17.3.0 (os --help lists no job command; no jobs route in rest/runtime/hono-server dist; objectstack main d5f4c2a2 has none either; sys_job has no action) so a scheduled job such as duly_dispatch can only wait for its cron · lands: objectstack (service-job / rest / console) · dedupe words: run job now, trigger job REST, sys_job manual run, IJobService.trigger HTTP",
        "class: a · reach: People import (POST /api/v1/auth/admin/import-users, passwordPolicy auto) on pnpm dev 17.3.0 writes 12 sys_email rows whose subject is 'Reset your ObjectStack password' and body 'We received a request to reset the password' for accounts that never had one; not checked against objectstack main · lands: objectstack plugin-auth · dedupe words: account invitation email, import-users invite subject, reset password wording invite",
        "class: a · reach: docs/import/walkthrough.md step 2 says imported people are 'directory rows, not logins — nobody can sign in as them'; on 17.3.0 the same import creates 12 accounts with email invitations (measured above) · lands: duly docs · dedupe words: walkthrough people not logins, import-users invitation, walkthrough 17.2.0 drift",
        "carrier: none — candidate fold into #128 (customer-specific residue), seat's call · 37 lines of customer sales-deck references (deck pNN, 方案 pNN, pre-sales) in 11 files under src/, test/, docs/import/, listed per file in docs/template-checklist.md item 4; comments and test titles only, no runtime reach · noted, not filed",
        "carrier: none · first pnpm dev boot prints one ADR-0087 conversion warning (required: true converted to storage.notNull: true, retiring from the load path in protocol 18) on a freshly compiled artifact · noted, not filed"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    ACCEPT → PR #141 comment 6410215453 (2026-10-26T07:04Z). PR flipped ready, review requested from the maintainer; lands when the maintainer merges.


    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