@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.
- package/LICENSE +202 -0
- package/README.md +326 -2
- package/THIRD-PARTY-NOTICES.md +235 -0
- package/bin/public/openeng.js +10528 -0
- package/package.json +21 -4
- package/skill/build-ui/SKILL.md +132 -0
- package/skill/conventions/SKILL.md +197 -0
- package/skill/demo/SKILL.md +112 -0
- package/skill/new-use-case/SKILL.md +132 -0
- package/skill/openeng/SKILL.md +238 -0
- package/skill/playbooks/engineering-requirements.md +121 -0
- package/skill/playbooks/product-lifecycle.md +115 -0
- package/skill/playbooks/project-management.md +100 -0
|
@@ -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.
|