@openengio/cli 0.0.0-stage → 0.23.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,238 @@
1
+ ---
2
+ name: openeng
3
+ description: Use when you need to work with an OpenEngineering platform through its command line, `openeng`. Signing in, listing projects and types, editing object types, writing objects on a branch and submitting them for review.
4
+ ---
5
+
6
+ # Working with the platform through `openeng`
7
+
8
+ `openeng` is the platform's command line. Install the public npm package:
9
+
10
+ ```
11
+ npm install -g @openengio/cli
12
+ ```
13
+
14
+ Upgrading from `@benjaminfh/oe2`: first run the earlier package's `logout` command, so its stored
15
+ session does not stay on this machine; then uninstall it and install `@openengio/cli`. The command
16
+ is now `openeng`, the environment variables are
17
+ `OPENENG_HOST`, `OPENENG_SIGN_IN_ORIGIN` and `OPENENG_SESSION_STORE`, and you sign in again once
18
+ with `openeng login`.
19
+
20
+ This skill gives the commands and their order. It gives no input shapes, because the commands print
21
+ their own. Before you send a generated command (`objects-sdk`, `branches-sdk` and the other
22
+ `<module> <method>` commands), run `openeng help <module> <method>`. It prints the fields, the kinds a
23
+ field may take, the selector keys and one example input, and needs no sign-in.
24
+
25
+ ## Read the topic for your task
26
+
27
+ - A person new to OpenEngineering who wants a tour, or has just signed in with no task of their own: `openeng skill demo`.
28
+
29
+ - Designing a new use case: `openeng skill new-use-case`.
30
+ - Building an object drawer or App view: `openeng skill build-ui`.
31
+ - Field meanings, edge direction, trees and type versions: `openeng skill conventions`.
32
+ - A domain model: `openeng skill playbook engineering-requirements`,
33
+ `openeng skill playbook product-lifecycle`, or `openeng skill playbook project-management`.
34
+
35
+ ## Rules that hold for every command
36
+
37
+ - Add `--json` when you read the answer yourself. It prints one JSON value on standard output.
38
+ - Exit code 0 is success. Any other exit code is a refusal or a failure, and its message says what
39
+ to do. Read it; do not retry the same command unchanged.
40
+ - When you report a refusal to the person, quote its `reference:` line (the `reference` field under
41
+ `--json`) exactly. The line is how the platform's operators find the request. A refusal with no
42
+ such line was built by `openeng` itself, or the host sent no id with it.
43
+ - A refusal of a field names the field, such as `input.correlation`, and the kinds it may take.
44
+ Fix that field and send the command again.
45
+ - `openeng help` lists every command. `openeng help <command words>` prints one command's help: what it
46
+ does, an example and the shape of its output. `openeng help <group>` lists a group's commands.
47
+ `openeng --version` prints the published version.
48
+ - `openeng` has no host built in. The production host is `https://api.openeng.io`: pass
49
+ `--host https://api.openeng.io`, or set `OPENENG_HOST=https://api.openeng.io` once.
50
+ - `openeng orgs list` and `openeng organisations list` mean `openeng org list`; `openeng project list` means
51
+ `openeng projects list`.
52
+ - A mutation or a branch command that needs a `correlation` mints it for you when your input has
53
+ none. Leave it out unless you have a reason to send your own.
54
+ - Generated commands take `--selector <json>` for what they act on and `--input <json>`,
55
+ `--input -` or `--input-file <path>` for what they send. Read the ids you need from `--json`
56
+ output and never invent one.
57
+
58
+ ## 1. Sign in and orient
59
+
60
+ 1. `openeng help` to see what exists.
61
+ 2. `openeng login`. It opens a browser to sign in; `openeng login --no-open` prints the address instead.
62
+ 3. `openeng whoami` to confirm who you are.
63
+ 4. `openeng org list --json` prints the organisations you belong to. `openeng org attach <id>` attaches
64
+ your session to one. If you have no organisation, create one with
65
+ `openeng org create --name <name>`, then attach to the organisation it created.
66
+ 5. Until you attach, these commands run without an organisation: `openeng login`, `openeng logout`,
67
+ `openeng whoami`, `openeng help`, `openeng skill`, `openeng org list`, `openeng org attach <id>`,
68
+ `openeng org create --name <name>`, and `openeng org current`. The generated command
69
+ `openeng admin-sdk createOrganisation` also runs unattached. Other commands refuse with "not attached
70
+ to an organisation" before they send anything.
71
+ 6. `openeng projects list --json`. Note each project's id and its namespace; later steps need both.
72
+ 7. `openeng types list --project <project id>` to see the project's published types, each with its
73
+ published version.
74
+
75
+ For a generic open-cycle gas turbine demonstration project, run `openeng demo seed --project <project id> [--size standard|full]`.
76
+
77
+ ### Which organisation you are in
78
+
79
+ - `openeng org current` prints the organisation your session is attached to, or none.
80
+ `openeng org detach` removes the attachment, and the commands refuse again until you attach.
81
+ - The CLI passes no scope for `openeng login`, `openeng logout`, `openeng whoami`, `openeng help`, `openeng skill`,
82
+ `openeng org list`, `openeng org attach <id>`, `openeng org create --name <name>`, `openeng org current`,
83
+ `openeng org detach`, and `openeng admin-sdk createOrganisation`. Other commands print their scope on
84
+ standard error when the platform answers them, as
85
+ `org: <name> (<id>)`, then `· project: <id>` and `· ref: <ref>` when you named them. Read it
86
+ before you trust an answer.
87
+ - With `--json`, the one value on standard output carries the same scope as a `scope` object:
88
+ `{"organisation": {"id", "name"}, "project"?, "ref"?}`. An object value gains a `scope` key.
89
+ A value that is an array or null, such as the list from `openeng projects list`, comes wrapped as
90
+ `{"scope": {...}, "value": <the original value>}`. A command with no scope carries no `scope`
91
+ field.
92
+ - A `not-found` in an organisation is often a project or a ref that belongs to another one. The
93
+ command prints "not found in organisation <name>: check that you are attached to the correct
94
+ organisation (openeng org current)". Run `openeng org current`; if it names the wrong organisation,
95
+ `openeng org list` and `openeng org attach <id>`.
96
+
97
+ ## 2. Define or change object types
98
+
99
+ Edit a file, not the published types directly. The change is a draft that is checked, reviewed and
100
+ then accepted.
101
+
102
+ If `openeng types list` says `no published types`, start the type file from the `changes` map in the
103
+ example input printed by `openeng help ontology-sdk reviseChangeSet`. Read `openeng help types draft revise`
104
+ to understand each part, then design the model with the person before you draft it.
105
+
106
+ 1. If the project has published types, run `openeng types export --project <project id> > draft.json`;
107
+ it writes them as one JSON object keyed by type key, each at the next version, ready to send
108
+ with revise. If it has no published types, create `draft.json` from the `changes` map in the
109
+ example input printed by `openeng help ontology-sdk reviseChangeSet`.
110
+ 2. Make `draft.json` hold only the types you change: delete every other key, and keep each type you
111
+ keep whole, as the export wrote it. Accepting a type you did not change publishes an identical
112
+ new version of it.
113
+ 3. `openeng types draft open` opens a change set on your organisation's namespace. It prints the change
114
+ set id and a revision. If one is already open, `openeng types draft current` shows it.
115
+ 4. `openeng types draft revise --change-set <id> --revision <revision> --from draft.json` sends your
116
+ file. It prints the new revision. Use the newest revision in every later step.
117
+ 5. `openeng types draft validate --change-set <id> --revision <revision>` must report no violations.
118
+ It exits 0 when there are no violations, and exits 4 with the violations on standard output
119
+ otherwise; then edit the file and revise again.
120
+ 6. `openeng types draft show --change-set <id> --project <project id>` shows what changes against the
121
+ published types, per type and per field. Check that it is exactly the change you meant.
122
+ 7. `openeng types draft accept --change-set <id> --revision <revision>` publishes it. The new version
123
+ is now the published one: from here on, take a type's version for data writes from
124
+ `openeng types list`.
125
+
126
+ To abandon a draft, `openeng types draft discard --change-set <id>`.
127
+
128
+ `presentationBindings.typeIcon` is a Material Symbols Rounded name from the installed
129
+ `@material-symbols/font-400` set, such as `memory` or `developer_board`, not an arbitrary label
130
+ (for example, `cpu` is invalid). `openeng types icons <text>` lists valid names and needs no sign-in; the full list is at https://docs.openeng.io/reference/icons/.
131
+ Publication refuses unknown or empty names. Existing unknown icons show an empty box and
132
+ must be corrected before publishing that type again.
133
+
134
+ An object type's `subscriptionRoles` field declares which roles it admits: owner, approver or watcher.
135
+ Owner is limited to one; approver and watcher may have optional maxima. Without the field, only
136
+ watchers are admitted; the publication validator decides whether a declaration is valid.
137
+
138
+ ## 3. Write data
139
+
140
+ Data is written on a branch and then submitted for review.
141
+
142
+ 1. `openeng help objects-sdk mutate` and `openeng help branches-sdk createBranch` for the fields, the
143
+ selector keys and an example each.
144
+ 2. `openeng branches-sdk createBranch` makes a branch in the project. It answers the branch's ref,
145
+ written `<project id>/<name>`.
146
+ 3. `openeng objects-sdk mutate` creates, changes or deletes an object or an edge on that ref. A ref in
147
+ a selector takes one of two forms: the project's trunk is the bare `main`, with no project id;
148
+ a branch is its whole ref, `<project id>/<name>`, the slash and the project id included. Use
149
+ `main` to read what is published, and the branch's ref to read or write your own work, here and
150
+ for `openeng objects-sdk readObject` and `openeng objects-sdk queryObjects`.
151
+ 4. Read back what you wrote: `openeng objects-sdk readObject` for one object, or
152
+ `openeng objects-sdk queryObjects` for a list. Use the type key and version the project's
153
+ `openeng types list` showed.
154
+ 5. `openeng objects-sdk executeVerb` runs a verb a type defines. `openeng objects-sdk discoverVerbs` lists
155
+ the verbs available.
156
+ 6. `openeng branches-sdk submitProposal` sends the branch for review. It names the branch by its
157
+ `name` alone, the part of the ref after the slash.
158
+
159
+ If a command is refused, the refusal names the field and its allowed kinds. Run
160
+ `openeng help <module> <method>` again and compare.
161
+
162
+ ## 4. Link to a page
163
+
164
+ To give the person a page, run `openeng link` and hand them the address it prints; never write a path
165
+ or an address yourself. `openeng link <kind> --project <id> --ref <ref>` takes `explore`, `branch-diff`
166
+ or `project`; `openeng link <kind> <identifier> --project <id> --ref <ref>` takes `object`, `type`, `proposal` or
167
+ `app` (the app's first page); `openeng link app-page <appKey> <pageKey> --project <id> --ref <ref>` takes
168
+ one page of an app; `openeng link app-draft <appKey> --ref <ref>` takes the app's draft screen and no
169
+ project. `openeng link ontology --ref <ref>` and `openeng link change-set --ref <ref>` take a ref and no
170
+ project, and `openeng link organisation-page <page>` takes neither flag. The organisation is the one
171
+ your session is attached to.
172
+
173
+ ## 5. Show data to the person
174
+
175
+ The CLI draws nothing. Read the `--json` output of a query or a read and draw it yourself, as a
176
+ table or a tree in ASCII, or as a Mermaid diagram when the person's tool renders it. Draw only
177
+ what the output holds.
178
+
179
+ ## 6. Connect an Onshape account
180
+
181
+ The connector commands import an Onshape account's documents into a mirror project. Each
182
+ command's help, such as `openeng help connector create` or `openeng help connector run`, names the
183
+ capability it needs. Through the CLI you act with the signed-in person's user token, so you can do
184
+ what that person may and nothing more.
185
+
186
+ Before you create a connection, tell the person this, because create prints it on standard error
187
+ and the person must know it: "Everyone with access to this project sees every document this
188
+ Onshape account can see."
189
+
190
+ The order, from no connection to a first imported document:
191
+
192
+ 1. `openeng connector create --system onshape --stack <stack> --name <text> [--company <id>]
193
+ [--team <id> | --owner <id>] [--label <text>]`. `--stack` is the Onshape stack label, as in
194
+ `cad`. At most one of `--team` and `--owner`. With neither, `--company` is required and must be the
195
+ company's own identifier, never a user's. It prints the connection identifier and the change
196
+ set it drafted for the connector's types, or the rule that stopped the drafting.
197
+ 2. `set-credential <connection>`: the command reads the access key and the secret key at a terminal
198
+ prompt only, with no flag and no environment variable. Do not ask for the Onshape keys, do not
199
+ accept them in the conversation, and do not type them on the person's behalf. Ask the person to
200
+ run `openeng connector set-credential <connection>` at their own terminal. Setting it again replaces
201
+ the stored credential. The person can cancel at either prompt with Control-C; the command then
202
+ says no keys were set.
203
+ 3. A person who holds `administer types` reviews the change set (`openeng types draft show
204
+ --change-set <id> --project <mirror project id>`) and accepts it (`openeng types draft accept
205
+ --change-set <id> --revision <token>`). Until then a run refuses with `types-not-approved`.
206
+ `openeng connector draft-types <connection>` drafts again.
207
+ 4. `openeng connector run <connection>` prints the run identifier. `openeng connector runs <connection>`
208
+ lists the runs newest first with state, counts and failure kind; read it until the state is
209
+ `succeeded` or `failed`.
210
+ 5. `openeng connector revoke <connection>` ends the connection.
211
+
212
+ Mirrored objects are read-only in practice: the next import sets back a person's change to a
213
+ mirrored property and counts it `overwritten`. The next import also creates a deleted mirrored
214
+ object again, with a new identifier, and counts it `created`; links people made to the old object
215
+ are gone. Do not write to a mirror project expecting the change to stay.
216
+
217
+ Refusals you will meet, with what each means and what to do:
218
+
219
+ - `types-not-approved`: the connector's types wait for approval by a person who holds the
220
+ permission to administer types. Ask such a person to review and accept the connector's change
221
+ set; read it with `openeng types draft current`.
222
+ - `import-running`: a run of this connection is already running. List the connection's runs with
223
+ `openeng connector runs <connection>`.
224
+ - `connection-revoked`: the connection is revoked, so it takes no further change or run. A new
225
+ connection makes a new mirror project.
226
+ - `not-permitted`: the operation was refused. What the request names may not exist, or the person
227
+ may not have permission for it; the answer is the same either way. Check that the request names
228
+ something the person can reach; if it does, the person must ask an administrator for the
229
+ permission.
230
+ - `credential-not-valid`: Onshape did not accept the credential, and nothing was stored. The person
231
+ checks the keys and runs `set-credential` again.
232
+ - `connection-exists`: the organisation already has a live connection to this account on this
233
+ stack. List the connections with `openeng admin-sdk listConnections` rather than creating another.
234
+ - `connector-template-missing`: this deployment holds no type template for the connector's system.
235
+ No remedy is in your reach; tell the person.
236
+ - `change-set-open`: the organisation already has an open change set, so drafting the types
237
+ stopped. Read it with `openeng types draft current` and continue with it; the connection exists, and
238
+ `openeng connector draft-types <connection>` drafts once that change set is settled.
@@ -0,0 +1,121 @@
1
+ # Playbook: an engineering requirements platform
2
+
3
+ For a team that wants what DOORS or Jama gives it: requirements, their decomposition, how designs meet
4
+ them, how they are verified, and the risks against them, all traced. Read `openeng skill conventions` first.
5
+
6
+ ## Reference products, and what sets them apart
7
+
8
+ | product | organised around | what that means for a model |
9
+ |---|---|---|
10
+ | IBM DOORS (classic) and DOORS Next | **documents**: a module is a specification, an ordered outline of headings and "shall" statements; links run between objects in different modules | a document type and section headings, with order, become types of their own |
11
+ | Jama Connect | **items** in a project tree organised by components (a system or subsystem), sets and folders; typed relationships with rules from an upstream item type to a downstream one; coverage from those rules | the system tree is the backbone and every item hangs off a system; a document is a view or an export, not a type |
12
+ | SysML tools | **model elements** with «satisfy», «verify», «deriveReqt» relationships that point at the requirement | the same item model, with arrows drawn at what is proved |
13
+
14
+ On this platform the item-centric shape fits best: every item is an object, every relationship an edge,
15
+ and a specification document is a view of a system's subtree. Choose the document-centric shape only
16
+ when the team's deliverable is the document itself and its order matters more than its traces.
17
+
18
+ ## The decisions that shape the model
19
+
20
+ 1. **Organised around systems or around documents.** Recommend systems. A document-centric model needs a
21
+ `document` and a `section` type, an `order` property, and one structural edge per pair of parent and
22
+ child types, because each edge end takes one type.
23
+ 2. **One requirement type, or one per level** (stakeholder need, system, subsystem). Recommend one type
24
+ whose level comes from where it sits in the system tree: one decomposition edge then serves every
25
+ level. One type per level gives each level its own fields, but every pair of levels needs its own
26
+ decomposition edge.
27
+ 3. **Requirement against specification.** The requirement is the need (what must be true); the
28
+ specification is the design's answer (a chosen value or standard), joined by a satisfaction edge. The
29
+ alternative, a specification as a stricter requirement, joins them by decomposition instead.
30
+ 4. **What a verification proves.** Recommend requirements only. Jama's design-control practice puts the
31
+ acceptance criteria in the requirement and links the test to it; the specification is proved through
32
+ the requirement it satisfies. Proving specifications directly takes a second verification edge.
33
+ 5. **How a risk relates.** Recommend the risk upstream of the requirement that mitigates it
34
+ (`mitigated-by`), as Jama's traceability runs "from risks to mitigation", so "a risk with no
35
+ mitigation" is a coverage question. The
36
+ alternative, a risk hanging downstream of the requirement it threatens, keeps the requirement as the
37
+ anchor.
38
+ 6. **The direction convention**, "flow of work" or "points at what is proved" (`openeng skill conventions`,
39
+ section 3). The two worked models below take one each.
40
+ 7. **Identifiers.** The platform keeps no counter, so a human-readable identifier such as `SYS-042` is a
41
+ string the author or agent sets, by a prefix per system or level.
42
+
43
+ ## Worked model A: flow of work
44
+
45
+ Every edge's source is its upstream end.
46
+
47
+ | object type | one object is | title | required |
48
+ |---|---|---|---|
49
+ | `system` | a system, subsystem or component; systems nest | `name` | `identifier`, `name`, `level` |
50
+ | `requirement` | one "shall" statement, owned by one system | `title` | `identifier`, `title`, `statement`, `category`, `status`, `priority` |
51
+ | `specification` | the design's answer to a requirement | `title` | `identifier`, `title`, `statement`, `status` |
52
+ | `verification` | a planned test, analysis, inspection or demonstration | `title` | `identifier`, `title`, `method`, `status` |
53
+ | `verification-result` | one execution of a verification | `identifier` | `identifier`, `outcome`, `runDate` |
54
+ | `risk` | something that could go wrong | `title` | `identifier`, `title`, `severity`, `likelihood`, `status` |
55
+
56
+ Enumerations: requirement `category` (functional, performance, interface, constraint, safety,
57
+ regulatory), `status` (draft, in-review, approved, released, rejected, deprecated), `priority` (must,
58
+ should, could), `verificationMethod` (test, analysis, inspection, demonstration); verification `status`
59
+ (planned, ready, obsolete); result `outcome` (pass, fail, blocked, inconclusive); risk `severity`
60
+ (negligible to catastrophic), `likelihood` (rare to almost-certain), `status` (open, mitigated, closed).
61
+ Performance requirements carry optional `unit`, `targetValue` and `tolerance`.
62
+
63
+ | edge type | source to target | kind | parent end | reads from the source / the target |
64
+ |---|---|---|---|---|
65
+ | `contains` | system to system | structural | source | contains / part of |
66
+ | `has-requirement`, `has-specification`, `has-verification`, `has-risk` | system to each | structural | source | has … / … of |
67
+ | `has-result` | verification to verification-result | structural | source | has result / result of |
68
+ | `derives` | parent requirement to child requirement | traceability | source | derives / derived from |
69
+ | `satisfied-by` | requirement to specification | traceability | null | satisfied by / satisfies |
70
+ | `verified-by` | requirement to verification | traceability | null | verified by / verifies |
71
+ | `mitigated-by` | risk to requirement | traceability | null | mitigated by / mitigates |
72
+
73
+ Every edge reads `both-endpoints`. `requirement` lists `["has-requirement", "derives"]` and declares two
74
+ views, "By system" (`has-requirement`) first and "Decomposition" (`derives`). The rail has one group,
75
+ "Requirements management", in the order system, requirement, specification, verification, result, risk.
76
+ The trace reads left to right: system, requirement, child requirement, specification, verification,
77
+ result.
78
+
79
+ ## Worked model B: points at what is proved
80
+
81
+ The platform's own agent's teaching example. The arrow points at the requirement.
82
+
83
+ | edge type | source to target | kind | parent end |
84
+ |---|---|---|---|
85
+ | `contains` | system to system | structural | source |
86
+ | `has-requirement`, `has-specification`, `has-verification`, `has-risk` | system to each | structural | source |
87
+ | `derives` | child requirement to parent requirement | traceability | target |
88
+ | `satisfies` | specification to requirement | traceability | null |
89
+ | `verifies` | verification to requirement | traceability | null |
90
+ | `threatens-requirement` | risk to requirement | traceability | null |
91
+
92
+ Choose B for a team whose engineers read SysML or whose model will meet a SysML tool.
93
+
94
+ ## Questions the model answers, and how
95
+
96
+ | question | how |
97
+ |---|---|
98
+ | which requirements have no verification | requirements with no `verified-by` edge (model A: outgoing; model B: no incoming `verifies`) |
99
+ | which risks have no mitigation | risks with no `mitigated-by` edge |
100
+ | what a requirement breaks down into | the "Decomposition" tree, or `derives` from it |
101
+ | how a requirement is proved | the path requirement to verification to result |
102
+ | what a system must do | the "By system" tree under that system |
103
+
104
+ ## Sensible hybrids
105
+
106
+ - **Document views over the item model**: keep the system-centric types and give a system's subtree a
107
+ page that reads as a specification, rather than adding document and section types.
108
+ - **Requirements beside a product structure**: where the organisation already has parts (a PLM model),
109
+ link requirements to the parts that meet them instead of duplicating systems as parts.
110
+
111
+ ## Joining an existing catalogue
112
+
113
+ - Reuse an existing `system`, `part` or `component` type for the breakdown rather than add a second one.
114
+ - Use the existing model's direction convention, even where this playbook recommends the other.
115
+ - Follow its rail groups, naming and icons; add a "Requirements" group only when none fits.
116
+
117
+ ## Not on the platform today
118
+
119
+ - **Suspect links**: DOORS and Jama mark a link when its upstream end changes. Nothing does this yet; a
120
+ team can review changes through a proposal's diff and an object's history.
121
+ - **Coverage percentages** across levels: a count per question is a query; a roll-up is not built.
@@ -0,0 +1,115 @@
1
+ # Playbook: a product lifecycle management platform
2
+
3
+ For a team that wants what Teamcenter, Windchill or Arena gives it: parts and their revisions, the bill of
4
+ materials a product is built from, how it is made, and how changes to all of it are requested, approved and
5
+ released. Read `openeng skill conventions` first.
6
+
7
+ ## Reference products, and what sets them apart
8
+
9
+ | product | organised around | what that means for a model |
10
+ |---|---|---|
11
+ | Siemens Teamcenter, PTC Windchill | **items and item revisions** under lifecycle states (for example Prototype, PreReleased, Released, Canceled), with structured BOMs, alternates and formal change workflows | revisions are objects of their own; state is an enumeration on the revision |
12
+ | Arena (a PTC business) | **items and change orders** for hardware teams: an ECO lists its affected items, each with old and new revision and old and new lifecycle phase, and refers to the ECR it came from | change requests and change orders are objects; what a change does to each revision is recorded on the link |
13
+ | Onshape, Fusion release management | **CAD documents** with versions and releases | the geometry lives in the CAD tool; the model holds the part, its revisions and a reference to the released CAD version |
14
+
15
+ Across them: a **change request** (ECR) records a problem and a proposal; a **change order** (ECO) carries out
16
+ the approved change and lists what it affects. An **EBOM** is the product as designed; an **MBOM** is the
17
+ product as it is built, with plant, make-or-buy, alternates, routing and work instructions added.
18
+
19
+ ## The decisions that shape the model
20
+
21
+ 1. **Which BOM is the base.** This playbook takes the **MBOM** as the base case: the structure the shop floor
22
+ builds from, with each line's quantity and unit of measure, the operation that consumes it, and its
23
+ alternates. An EBOM beside it is a hybrid (below).
24
+ 2. **A revision as an object, or as the part's history.** Recommend objects. The platform keeps every object's
25
+ history anyway, but only an object can be pinned by a BOM line, released, or named by a change order.
26
+ 3. **A BOM line as an object, or as an edge with properties.** Recommend an object. An edge can carry quantity,
27
+ but a BOM line also pins a revision and is consumed by an operation, and an edge cannot point at an edge.
28
+ 4. **How change is modelled.** `change-request` and `change-order` are objects; the change itself is made on a
29
+ branch, submitted as a proposal, and merged; the change order links the revisions it affects, with each
30
+ revision's old and new state on the link. The platform's proposal alone would carry the change
31
+ but not the record an engineering team needs: the reason, the affected items, and their states.
32
+ 5. **Make or buy, per part or per plant.** Recommend a property on the part for a single-plant team, and on the
33
+ BOM line when the same part is made in one plant and bought in another.
34
+ 6. **The direction convention.** This playbook uses "flow of work" (`openeng skill conventions`, section 3): assembly to
35
+ line to component, request to order to revision.
36
+
37
+ ## Worked model: a manufacturing BOM
38
+
39
+ | object type | one object is | title | required |
40
+ |---|---|---|---|
41
+ | `part` | a part or assembly, as identified by its part number | `name` | `partNumber`, `name`, `makeOrBuy` |
42
+ | `revision` | one released or in-work state of a part | `revisionCode` | `revisionCode`, `lifecycleState` |
43
+ | `mbom-line` | one placement of a component in an assembly as built | `findNumber` | `findNumber`, `quantity`, `unitOfMeasure` |
44
+ | `operation` | one step of a part's routing | `name` | `sequence`, `name` |
45
+ | `work-centre` | a machine, cell or station where operations run | `name` | `code`, `name` |
46
+ | `plant` | a factory or site | `name` | `code`, `name` |
47
+ | `change-request` | a problem and a proposed change (ECR) | `title` | `identifier`, `title`, `status` |
48
+ | `change-order` | an approved change being carried out (ECO) | `title` | `identifier`, `title`, `status` |
49
+ | `release` | a set of revisions released together | `name` | `identifier`, `name`, `releasedOn` |
50
+
51
+ Enumerations: part `makeOrBuy` (make, buy); revision `lifecycleState` (in-work, prototyping, pre-released,
52
+ released, obsolete); mbom-line `unitOfMeasure` (each, kg, m, l); change-request `status` (open, in-review,
53
+ approved, rejected); change-order `status` (planned, in-work, released, cancelled). A line may carry optional
54
+ `scrapFactor`; an operation optional `setupMinutes` and `runMinutes`. The state many PLM systems call
55
+ "Prototype" is `prototyping` here, because the platform refuses `prototype` as an enumeration member
56
+ (`openeng skill conventions`, section 7).
57
+
58
+ | edge type | source to target | kind | parent end | reads from the source / the target |
59
+ |---|---|---|---|---|
60
+ | `has-revision` | part to revision | structural | source | has revision / revision of |
61
+ | `itemises` | part (assembly) to mbom-line | traceability | source | itemises / line of |
62
+ | `uses` | mbom-line to part (component) | traceability | source | uses / used on |
63
+ | `pins` | mbom-line to revision | traceability | null | pins / pinned by |
64
+ | `has-operation` | part to operation | structural | source | has operation / operation of |
65
+ | `consumed-at` | mbom-line to operation | traceability | null | consumed at / consumes |
66
+ | `performed-at` | operation to work-centre | traceability | null | performed at / performs |
67
+ | `has-work-centre` | plant to work-centre | structural | source | has work centre / work centre of |
68
+ | `alternate` | mbom-line to part | traceability | null | alternate / alternate for |
69
+ | `raises` | change-request to change-order | traceability | null | raises / raised by |
70
+ | `affects` | change-order to revision | traceability | null | affects / affected by |
71
+ | `releases` | release to revision | traceability | null | releases / released by |
72
+
73
+ `affects` carries the change's effect on each revision as edge properties, `fromState` and `toState`, both
74
+ the revision's lifecycle enumeration. `alternate` carries an optional `priority`. `itemises` and `uses` are
75
+ traceability with a parent end, so a shared component appears under every assembly that uses it.
76
+
77
+ Trees and the rail: `part` declares the view "Manufacturing structure", steps `itemises` then `uses`, decorated
78
+ with the line's find number, quantity and unit of measure, first; and "Routing", step `has-operation`. A
79
+ `plant` tree shows its work centres. The rail group "Manufacturing" places part, change request, change order,
80
+ release and plant; `mbom-line`, `revision`, `operation` and `work-centre` carry no `rail`, because each is
81
+ reached through a part or a plant.
82
+
83
+ ## Questions the model answers, and how
84
+
85
+ | question | how |
86
+ |---|---|
87
+ | what is this assembly built from, with quantities | the "Manufacturing structure" tree under the assembly |
88
+ | where is this part used | the parts reached backwards through `uses` then `itemises` (`findPaths` or `queryGraph`, incoming) |
89
+ | which revision does each line build | each line's `pins` edge |
90
+ | how is this part made, and where | its "Routing" tree, and each operation's `performed-at` |
91
+ | what did this change touch | the change order's `affects` edges, with old and new state |
92
+ | which open changes affect this part | change orders with an `affects` edge to one of its revisions, status not released |
93
+
94
+ ## Sensible hybrids
95
+
96
+ - **EBOM and MBOM together**: an `ebom-line` type beside `mbom-line`, both from `part`, and an edge from each
97
+ MBOM line to the EBOM line it realises; the EBOM is the design's structure, the MBOM the plant's.
98
+ - **PLM with requirements**: link the requirements model's `specification` or `system` to the `part` that
99
+ realises it (`openeng skill playbook engineering-requirements`), so a change order can be traced to the requirements it
100
+ touches.
101
+ - **Several plants**: make-or-buy, scrap and routing move from the part to the line or to a per-plant object.
102
+
103
+ ## Joining an existing catalogue
104
+
105
+ - Reuse an existing `part`, `component` or `system` type for the product breakdown rather than add a second.
106
+ - Use the existing model's direction convention.
107
+ - Where a requirements model exists, add the realisation edge above rather than duplicating systems as parts.
108
+
109
+ ## Not on the platform today
110
+
111
+ - **Effectivity** (a line valid from a date or a serial number): a date property is possible; nothing filters
112
+ a structure by it.
113
+ - **Mass change** of many lines, and a **cost roll-up** across a structure: a count per question is a query, a
114
+ roll-up is not built.
115
+ - **CAD geometry**: an object view can show an STL property (`STLViewer`); there is no live CAD link.
@@ -0,0 +1,100 @@
1
+ # Playbook: a project management platform
2
+
3
+ For a team that wants what Jira, Linear or MS Project gives it: work broken into items, grouped into projects
4
+ and timeboxes, with dependencies between them, and, on this platform, tied to the engineering items the work
5
+ advances. Read `openeng skill conventions` first.
6
+
7
+ ## Reference products, and what sets them apart
8
+
9
+ | product | organised around | what that means for a model |
10
+ |---|---|---|
11
+ | Jira | **issues** of configurable types (epic, story, task, sub-task), each type with its own workflow, joined by issue links | one type per level, or one type with a kind; links are edges |
12
+ | Linear | **issues** in one fixed workflow (Backlog, Unstarted, Started, Completed, Canceled), priority 0 to 4, grouped by cycles (sprints), projects with milestones that span cycles, and initiatives above projects; an issue need not belong to a project | one work-item type with a kind; cycles, projects and milestones are objects |
13
+ | MS Project | **a schedule**: tasks with durations, dependencies of four kinds (finish-to-start, start-to-start, finish-to-finish, start-to-finish) with lag, and the critical path computed from them | dates follow from dependencies; this platform has no scheduler, so dates are properties and dependencies are edges to query |
14
+
15
+ ## The decisions that shape the model
16
+
17
+ 1. **Issue-centric or schedule-centric.** This platform computes no dates, so a model here is issue-centric:
18
+ start and due dates are properties, and a dependency is an edge to query, not a constraint that moves dates.
19
+ 2. **One work-item type with a kind, or a type per level.** One `work-item` type with `kind` (epic, story, task,
20
+ bug), as Linear does: one hierarchy edge serves every level, and a query filters by kind.
21
+ The
22
+ cost is that nothing stops a task being the parent of an epic; the playbook's hierarchy is a convention the
23
+ person and the agent keep. A type per level would enforce it, with one hierarchy edge per pair of levels.
24
+ 3. **Timeboxes.** Cycles as objects, so "what is in cycle 12" is a query, not a label.
25
+ 4. **Joining the engineering work.** A work item links to the engineering items it advances: a requirement, a
26
+ part, a verification. This is the reason to run project work on this platform rather than in
27
+ Jira: "which work is open against BAT-001" and "which requirements have no work planned" become queries over
28
+ one model.
29
+ 5. **The direction convention.** "Flow of work" (`openeng skill conventions`, section 3): container to item, earlier to
30
+ later, work to what it advances.
31
+
32
+ ## Worked model: issues tied to engineering
33
+
34
+ The `advances` edges assume the requirements model's `requirement` and the PLM model's `part` exist
35
+ in the organisation; drop the
36
+ ones whose target type is absent.
37
+
38
+ | object type | one object is | title | required |
39
+ |---|---|---|---|
40
+ | `initiative` | a goal several projects serve | `name` | `name`, `status` |
41
+ | `project` | a body of work with a lead and an end | `name` | `name`, `status` |
42
+ | `milestone` | a point a project must reach by a date | `name` | `name`, `dueOn` |
43
+ | `work-item` | one piece of work: an epic, story, task or bug | `title` | `identifier`, `title`, `kind`, `status`, `priority` |
44
+ | `cycle` | a timebox, such as a two-week sprint | `name` | `name`, `startsOn`, `endsOn` |
45
+
46
+ Enumerations: work-item `kind` (epic, story, task, bug), `status` (backlog, unstarted, started, completed,
47
+ cancelled), `priority` (urgent, high, medium, low, none); initiative and project `status` (planned, active,
48
+ completed, cancelled). A work item carries optional `owner` (a person), `estimate` (a number) and `dueOn`; a
49
+ project carries `lead` (a person).
50
+
51
+ | edge type | source to target | kind | parent end | reads from the source / the target |
52
+ |---|---|---|---|---|
53
+ | `has-project` | initiative to project | structural | source | has project / project of |
54
+ | `has-milestone` | project to milestone | structural | source | has milestone / milestone of |
55
+ | `has-work-item` | project to work-item | structural | source | has work item / work item of |
56
+ | `breaks-into` | work-item to work-item | traceability | source | breaks into / part of |
57
+ | `targets` | work-item to milestone | traceability | null | targets / targeted by |
58
+ | `planned-in` | cycle to work-item | traceability | null | plans / planned in |
59
+ | `blocks` | work-item to work-item | traceability | null | blocks / blocked by |
60
+ | `advances-requirement` | work-item to requirement | traceability | null | advances / advanced by |
61
+ | `advances-part` | work-item to part | traceability | null | advances / advanced by |
62
+
63
+ `breaks-into` is traceability with a parent end, so a story can sit under its epic while its home is its
64
+ project. A work item outside any project has no `has-work-item` edge and is a root of its own. Each `advances`
65
+ target is its own edge type, because an edge end takes one type.
66
+
67
+ Trees and the rail: `work-item` declares "By project" (`has-work-item`) first and "Breakdown" (`breaks-into`); an
68
+ initiative's tree shows its projects. The rail group "Planning" places initiative, project, work item and
69
+ cycle; `milestone` is reached through its project.
70
+
71
+ ## Questions the model answers, and how
72
+
73
+ | question | how |
74
+ |---|---|
75
+ | what is in this cycle | work items with a `planned-in` edge from the cycle |
76
+ | what is blocked, and by what | work items with an incoming `blocks` edge whose source is not completed |
77
+ | what does this epic break into | its "Breakdown" tree |
78
+ | which work is open against a requirement | work items with an `advances-requirement` edge to it, status not completed |
79
+ | which approved requirements have no work | requirements with no incoming `advances-requirement` edge |
80
+ | what is due before a milestone | work items with a `targets` edge to it |
81
+
82
+ ## Sensible hybrids
83
+
84
+ - **Type per level**: `epic`, `story` and `task` types, with `epic-has-story` and `story-has-task` edges, for a
85
+ team that wants each level's fields and the hierarchy enforced.
86
+ - **A light schedule**: `dependsOn` lag and a dependency kind as properties of `blocks`, read by the person; the
87
+ platform still computes no dates.
88
+
89
+ ## Joining an existing catalogue
90
+
91
+ - Add `advances` edges to whatever engineering types the organisation already has; this is the model's main
92
+ value.
93
+ - Reuse an existing person or team model rather than add `assignee` objects; a `person` property names the owner.
94
+ - Use the existing model's direction convention.
95
+
96
+ ## Not on the platform today
97
+
98
+ - **Computed schedules**: no critical path, no dates moved by dependencies, no capacity planning.
99
+ - **Workflow enforcement**: a status is an enumeration; nothing stops a jump from backlog to completed.
100
+ - **Burndown and velocity**: counts per cycle are queries; charts over time are not built.