diff --git a/AGENTS.md b/AGENTS.md index a2d0f33..87fce6a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -105,7 +105,10 @@ Do all of this, in this repo first: Record rows stay empty when calibration is `unpublished`. Do not invent record rows to clear that flag. Classify every principle in `tests/fixtures/facet-audit.json`. The decision for a facet that exists - is `map`. + is `map`. Every company needs `data/teaching//index.json` and + a teaching file per principle. Reading-only files (`id`, `slug`, `blog`) + are enough when full prose is not written. Further reading must be + official sources that resolve. 5. Update the company list and block in `SCHEMA.md`. Tests fail if you skip this. 6. A new company's name and source belong in `scripts/companies.py` and diff --git a/README.md b/README.md index b2b72db..d5e7c9d 100644 --- a/README.md +++ b/README.md @@ -42,9 +42,9 @@ flowchart TD facet -->|shared through the facet| biq ``` -Teaching prose is in `data/teaching/`. Only Amazon and generic have it today, but that will be fixed soon. Porridge's "Questions that make the principle concrete." is the `deepen` list on that teaching file. +Teaching prose is in `data/teaching/`. Every company has a catalog and a teaching file per principle. Amazon and the universal set have the full prose. The other companies ship Further reading on those files, from official sources, until full teaching is written. Porridge's "Questions that make the principle concrete." is the `deepen` list on that teaching file. -The other companies in the corpus are Amazon, Arm, Coupang, Delivery Hero, GitLab, Dawn Aerospace, and Toyota. What each calls the set, and where the wording came from, is in `scripts/companies.py`. The record shape is [SCHEMA.md](SCHEMA.md). +The other companies in the corpus are Amazon, Arm, Coupang, Delivery Hero, GitLab, Dawn Aerospace, Toyota, Blue Origin, and the U.S. Marine Corps. What each calls the set, and where the wording came from, is in `scripts/companies.py`. The record shape is [SCHEMA.md](SCHEMA.md). ## Outside diff --git a/SCHEMA.md b/SCHEMA.md index c4cdf1d..a19bb1c 100644 --- a/SCHEMA.md +++ b/SCHEMA.md @@ -361,10 +361,22 @@ the files already use. `blog` is the Further reading list. It is not renamed. ### Files -- `data/teaching//index.json` catalog, for each company that has teaching. -- `data/teaching//.json` one principle. - -A catalog `principles` list may be empty. That is Further reading for the set and no principle teaching files yet. USMC is that case. Each entry is `id`, `slug`, and `file`. `file` is `.json` in that directory, and the file has to exist. A slug is listed once. `index` is reserved for the catalog and is not a principle slug. When the catalog exists, a teaching file other than the catalog has to be listed. +- `data/teaching//index.json` catalog. Every company has one. +- `data/teaching//.json` one principle. Every principle has one. + +A catalog `principles` list may be empty in a fixture. That is Further reading +for the set and no principle teaching files yet. The live corpus lists every +principle. Each entry is `id`, `slug`, and `file`. `file` is `.json` in +that directory, and the file has to exist. A slug is listed once. `index` is +reserved for the catalog and is not a principle slug. When the catalog exists, +a teaching file other than the catalog has to be listed. + +A principle file may be reading-only: `id`, `slug`, and `blog`. Porridge +renders that list on the principle page. Full teaching prose is required when +any of `why`, `calibrationIntro`, `examples`, `looksLike`, `deepen`, or +`related` is present. `validate.py` fails the live tree when a company is +missing a catalog or a principle file. A missing file is a silent empty +Further reading section in the apps, so the check is the contract. Amazon is the classic 14. Any Company (`generic`) reuses that teaching. `data/maps/-.json` records the reuse. The file names both @@ -427,17 +439,17 @@ Rules: - `id` is the numeric id of the principle record in this company. - `slug` matches the filename without `.json`, and that slug exists on a principle record for the company. -- `why` is 3-6 short paragraphs. Each array item is one paragraph. -- `examples` 2-4 teaching cases. Generalize retail and ops specifics. Drop named-exec anecdotes you cannot restate without the company. -- `deepen` 6-12 questions. Each is a full sentence ending with `?`. -- `related` is the union of every `{lp:slug}` token in the prose fields and notes plus any extra curated links. Each `related` id is a slug in this company. Two is a floor, not a cap. +- `why` is 3-6 short paragraphs. Each array item is one paragraph. Omit it on a reading-only file. +- `examples` 2-4 teaching cases. Generalize retail and ops specifics. Drop named-exec anecdotes you cannot restate without the company. Omit them on a reading-only file. +- `deepen` 6-12 questions. Each is a full sentence ending with `?`. Omit them on a reading-only file. +- `related` is the union of every `{lp:slug}` token in the prose fields and notes plus any extra curated links. Each `related` id is a slug in this company. Two is a floor, not a cap. Omit it on a reading-only file. A reading-only note must not carry a `{lp:slug}` token, because there is no `related` list to put it on. - `blog` is the Further reading list. It holds published tig.log essays that amplify this principle, plus at least one external source: the published principles, a shareholder letter, a book, or an essay or talk by someone who shaped the practice. Same shape on every file, including the catalog. Empty is not allowed. A principle with no tig.log essay still gets its external source. A reused set may append Further reading after the copied list. Copied entries stay in step with the target. Extra entries are the source set's own. `validate.py` allows a longer `blog` array on the source when the target's entries are the prefix. - A tig.log essay, a post in the WordPress Essays category (slug `essays`, id 448), is linked at `https://kindel.com/essays//` with the trailing slash. A blog post outside that category stays at `https://blog.kindel.com/YYYY/MM/DD//`. `scripts/essay_catalog.json` is the checked-in list of essay ids and slugs, from `https://blog.kindel.com/wp-json/wp/v2/posts?categories=448`. Refresh it by fetching every page (`per_page=100`, follow `X-WP-TotalPages`), keeping `id` and `slug`, and sorting by slug. `validate.py` rejects a `blog.kindel.com` URL whose dated slug or `?p=` id is in that list, and leaves every other blog URL alone. An apex essay link has to be exactly `https://kindel.com/essays//`, and that slug has to be in the catalog. A typo, a missing trailing slash, `http`, a root-relative path, a path with no leading slash, an extra segment, a doubled slash, a dot segment, or an encoded slash fails. Percent-encoding is decoded once, including on a blog permalink. A stored field is judged before trailing punctuation is removed. A `url` or `href` value is judged as the whole string, before it is split. Only a parsed kindel.com host whose path is under essays has to be the canonical catalog URL. A Markdown destination is read whole, including balanced parentheses and angle brackets, and a title after it is not part of the link. A backslash escapes ASCII punctuation only. One terminal DNS dot on the host is ignored. A kindel.com or blog.kindel.com link with no scheme is checked the same way. A bare URL keeps balanced parentheses. An equals sign before a root-relative path is not part of the link. JSON files are checked after decoding, which lets a sentence end on a canonical essay link. - Every `blog` link is real. Never invent a URL, and check that each URL resolves before it lands. External titles are the cite on the list. Use the published heading when it already names the work. When it is only a year or a short title, name the author or the source, and the work. Titles may name the source company or an executive. Notes follow the rules below. - Every string: no em dash, no `---`, Oxford commas, numbers under 10 spelled out. - No source-company names, products, executives, internal tools, or wiki chrome in the prose and notes. Further reading titles may name the author, the book, or the source company. -`validate.py` checks that the slug exists, that each `related` id exists, and that every `{lp:...}` token in the prose and notes resolves to a slug in the company and is listed in `related`. A token in the catalog must resolve too. A catalog `principles` list may be empty. Each listed `file` has to exist in that directory, named `.json`, and a slug is listed once. `index` is reserved for the catalog and is not a principle slug. When the catalog exists, a teaching file other than the catalog has to be listed. It also checks the counts and object shapes in the rules above, and that `blog` is a non-empty list of title, url, and note. It rejects an em dash and `---`. An en dash is allowed only in a Further reading title. It rejects a `blog.kindel.com` link whose post is in `scripts/essay_catalog.json`, and an essays link that is not exactly `https://kindel.com/essays//` for a slug in that file. Dot segments are folded first. A stored field keeps its trailing punctuation for that check. A `url` value with other text or surrounding space fails too. Percent-encoding is decoded once. `tests/test_reading.py` checks the Further reading shape and the approved cites. +`validate.py` checks that the slug exists, that each `related` id exists, and that every `{lp:...}` token in the prose and notes resolves to a slug in the company and is listed in `related`. A token in the catalog must resolve too. A catalog `principles` list may be empty. Each listed `file` has to exist in that directory, named `.json`, and a slug is listed once. `index` is reserved for the catalog and is not a principle slug. When the catalog exists, a teaching file other than the catalog has to be listed. A file whose keys are only `id`, `slug`, and `blog` skips the prose counts. Any other teaching field requires those counts. The live tree must have a catalog and a teaching file for every principle. It also checks the counts and object shapes in the rules above, and that `blog` is a non-empty list of title, url, and note. It rejects an em dash and `---`. An en dash is allowed only in a Further reading title. It rejects a `blog.kindel.com` link whose post is in `scripts/essay_catalog.json`, and an essays link that is not exactly `https://kindel.com/essays//` for a slug in that file. Dot segments are folded first. A stored field keeps its trailing punctuation for that check. A `url` value with other text or surrounding space fails too. Percent-encoding is decoded once. `tests/test_reading.py` checks the Further reading shape and the approved cites. ## Sourcing diff --git a/data/teaching/arm/be-decisive-in-ambiguity-and-change.json b/data/teaching/arm/be-decisive-in-ambiguity-and-change.json new file mode 100644 index 0000000..4dfb4ee --- /dev/null +++ b/data/teaching/arm/be-decisive-in-ambiguity-and-change.json @@ -0,0 +1,16 @@ +{ + "id": 2009, + "slug": "be-decisive-in-ambiguity-and-change", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/build-extraordinary-teams.json b/data/teaching/arm/build-extraordinary-teams.json new file mode 100644 index 0000000..cfb0c64 --- /dev/null +++ b/data/teaching/arm/build-extraordinary-teams.json @@ -0,0 +1,16 @@ +{ + "id": 2003, + "slug": "build-extraordinary-teams", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/challenge-skillfully.json b/data/teaching/arm/challenge-skillfully.json new file mode 100644 index 0000000..bfd4dba --- /dev/null +++ b/data/teaching/arm/challenge-skillfully.json @@ -0,0 +1,16 @@ +{ + "id": 2004, + "slug": "challenge-skillfully", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/deliver-as-one-arm.json b/data/teaching/arm/deliver-as-one-arm.json new file mode 100644 index 0000000..6abd25b --- /dev/null +++ b/data/teaching/arm/deliver-as-one-arm.json @@ -0,0 +1,16 @@ +{ + "id": 2002, + "slug": "deliver-as-one-arm", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/index.json b/data/teaching/arm/index.json new file mode 100644 index 0000000..5fd72f5 --- /dev/null +++ b/data/teaching/arm/index.json @@ -0,0 +1,68 @@ +{ + "title": "Arm 10x Mindset", + "source": "https://careers.arm.com/life-at-arm", + "principles": [ + { + "id": 2001, + "slug": "passion-for-the-mission", + "file": "passion-for-the-mission.json" + }, + { + "id": 2002, + "slug": "deliver-as-one-arm", + "file": "deliver-as-one-arm.json" + }, + { + "id": 2003, + "slug": "build-extraordinary-teams", + "file": "build-extraordinary-teams.json" + }, + { + "id": 2004, + "slug": "challenge-skillfully", + "file": "challenge-skillfully.json" + }, + { + "id": 2005, + "slug": "root-out-inefficiencies", + "file": "root-out-inefficiencies.json" + }, + { + "id": 2006, + "slug": "relentlessly-push-boundaries", + "file": "relentlessly-push-boundaries.json" + }, + { + "id": 2007, + "slug": "move-with-urgency-and-find-a-way", + "file": "move-with-urgency-and-find-a-way.json" + }, + { + "id": 2008, + "slug": "own-it", + "file": "own-it.json" + }, + { + "id": 2009, + "slug": "be-decisive-in-ambiguity-and-change", + "file": "be-decisive-in-ambiguity-and-change.json" + }, + { + "id": 2010, + "slug": "optimize-for-endurance-and-resilience", + "file": "optimize-for-endurance-and-resilience.json" + } + ], + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published 10x Mindset. Two lenses, 10 principles." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The company page that states the mission those principles serve." + } + ] +} diff --git a/data/teaching/arm/move-with-urgency-and-find-a-way.json b/data/teaching/arm/move-with-urgency-and-find-a-way.json new file mode 100644 index 0000000..dabd2da --- /dev/null +++ b/data/teaching/arm/move-with-urgency-and-find-a-way.json @@ -0,0 +1,16 @@ +{ + "id": 2007, + "slug": "move-with-urgency-and-find-a-way", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/optimize-for-endurance-and-resilience.json b/data/teaching/arm/optimize-for-endurance-and-resilience.json new file mode 100644 index 0000000..36283bb --- /dev/null +++ b/data/teaching/arm/optimize-for-endurance-and-resilience.json @@ -0,0 +1,16 @@ +{ + "id": 2010, + "slug": "optimize-for-endurance-and-resilience", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/own-it.json b/data/teaching/arm/own-it.json new file mode 100644 index 0000000..8421688 --- /dev/null +++ b/data/teaching/arm/own-it.json @@ -0,0 +1,16 @@ +{ + "id": 2008, + "slug": "own-it", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/passion-for-the-mission.json b/data/teaching/arm/passion-for-the-mission.json new file mode 100644 index 0000000..fd0cc46 --- /dev/null +++ b/data/teaching/arm/passion-for-the-mission.json @@ -0,0 +1,16 @@ +{ + "id": 2001, + "slug": "passion-for-the-mission", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/relentlessly-push-boundaries.json b/data/teaching/arm/relentlessly-push-boundaries.json new file mode 100644 index 0000000..d4d029a --- /dev/null +++ b/data/teaching/arm/relentlessly-push-boundaries.json @@ -0,0 +1,16 @@ +{ + "id": 2006, + "slug": "relentlessly-push-boundaries", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/arm/root-out-inefficiencies.json b/data/teaching/arm/root-out-inefficiencies.json new file mode 100644 index 0000000..8ecebbf --- /dev/null +++ b/data/teaching/arm/root-out-inefficiencies.json @@ -0,0 +1,16 @@ +{ + "id": 2005, + "slug": "root-out-inefficiencies", + "blog": [ + { + "title": "Life at Arm", + "url": "https://careers.arm.com/life-at-arm", + "note": "The published wording of this principle, under the 10x Mindset." + }, + { + "title": "Arm Company", + "url": "https://www.arm.com/company", + "note": "The mission and company context this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/bias-for-action.json b/data/teaching/blue-origin/bias-for-action.json new file mode 100644 index 0000000..0f45359 --- /dev/null +++ b/data/teaching/blue-origin/bias-for-action.json @@ -0,0 +1,16 @@ +{ + "id": 9006, + "slug": "bias-for-action", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/customer-focus.json b/data/teaching/blue-origin/customer-focus.json new file mode 100644 index 0000000..8363570 --- /dev/null +++ b/data/teaching/blue-origin/customer-focus.json @@ -0,0 +1,16 @@ +{ + "id": 9002, + "slug": "customer-focus", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/deliver-results.json b/data/teaching/blue-origin/deliver-results.json new file mode 100644 index 0000000..dbfbf91 --- /dev/null +++ b/data/teaching/blue-origin/deliver-results.json @@ -0,0 +1,16 @@ +{ + "id": 9003, + "slug": "deliver-results", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/earn-the-trust-of-others.json b/data/teaching/blue-origin/earn-the-trust-of-others.json new file mode 100644 index 0000000..1e3e079 --- /dev/null +++ b/data/teaching/blue-origin/earn-the-trust-of-others.json @@ -0,0 +1,16 @@ +{ + "id": 9009, + "slug": "earn-the-trust-of-others", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/embrace-team-blue.json b/data/teaching/blue-origin/embrace-team-blue.json new file mode 100644 index 0000000..fd29d2c --- /dev/null +++ b/data/teaching/blue-origin/embrace-team-blue.json @@ -0,0 +1,16 @@ +{ + "id": 9004, + "slug": "embrace-team-blue", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/have-backbone-disagree-and-commit.json b/data/teaching/blue-origin/have-backbone-disagree-and-commit.json new file mode 100644 index 0000000..6e8e095 --- /dev/null +++ b/data/teaching/blue-origin/have-backbone-disagree-and-commit.json @@ -0,0 +1,16 @@ +{ + "id": 9014, + "slug": "have-backbone-disagree-and-commit", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/hire-and-develop-the-best.json b/data/teaching/blue-origin/hire-and-develop-the-best.json new file mode 100644 index 0000000..d6eb013 --- /dev/null +++ b/data/teaching/blue-origin/hire-and-develop-the-best.json @@ -0,0 +1,16 @@ +{ + "id": 9010, + "slug": "hire-and-develop-the-best", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/index.json b/data/teaching/blue-origin/index.json new file mode 100644 index 0000000..1d7bfee --- /dev/null +++ b/data/teaching/blue-origin/index.json @@ -0,0 +1,88 @@ +{ + "title": "Blue Origin Leadership Principles", + "source": "https://www.blueorigin.com/careers/work-culture", + "principles": [ + { + "id": 9001, + "slug": "passion-for-our-mission", + "file": "passion-for-our-mission.json" + }, + { + "id": 9002, + "slug": "customer-focus", + "file": "customer-focus.json" + }, + { + "id": 9003, + "slug": "deliver-results", + "file": "deliver-results.json" + }, + { + "id": 9004, + "slug": "embrace-team-blue", + "file": "embrace-team-blue.json" + }, + { + "id": 9005, + "slug": "resourceful", + "file": "resourceful.json" + }, + { + "id": 9006, + "slug": "bias-for-action", + "file": "bias-for-action.json" + }, + { + "id": 9007, + "slug": "ownership", + "file": "ownership.json" + }, + { + "id": 9008, + "slug": "operational-excellence", + "file": "operational-excellence.json" + }, + { + "id": 9009, + "slug": "earn-the-trust-of-others", + "file": "earn-the-trust-of-others.json" + }, + { + "id": 9010, + "slug": "hire-and-develop-the-best", + "file": "hire-and-develop-the-best.json" + }, + { + "id": 9011, + "slug": "insist-on-the-highest-standards", + "file": "insist-on-the-highest-standards.json" + }, + { + "id": 9012, + "slug": "technical-ambition-and-simplicity", + "file": "technical-ambition-and-simplicity.json" + }, + { + "id": 9013, + "slug": "practice-humility", + "file": "practice-humility.json" + }, + { + "id": 9014, + "slug": "have-backbone-disagree-and-commit", + "file": "have-backbone-disagree-and-commit.json" + } + ], + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published 14 Leadership Principles." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission those principles are written to serve." + } + ] +} diff --git a/data/teaching/blue-origin/insist-on-the-highest-standards.json b/data/teaching/blue-origin/insist-on-the-highest-standards.json new file mode 100644 index 0000000..ae167af --- /dev/null +++ b/data/teaching/blue-origin/insist-on-the-highest-standards.json @@ -0,0 +1,16 @@ +{ + "id": 9011, + "slug": "insist-on-the-highest-standards", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/operational-excellence.json b/data/teaching/blue-origin/operational-excellence.json new file mode 100644 index 0000000..0950633 --- /dev/null +++ b/data/teaching/blue-origin/operational-excellence.json @@ -0,0 +1,16 @@ +{ + "id": 9008, + "slug": "operational-excellence", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/ownership.json b/data/teaching/blue-origin/ownership.json new file mode 100644 index 0000000..73c5b6a --- /dev/null +++ b/data/teaching/blue-origin/ownership.json @@ -0,0 +1,16 @@ +{ + "id": 9007, + "slug": "ownership", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/passion-for-our-mission.json b/data/teaching/blue-origin/passion-for-our-mission.json new file mode 100644 index 0000000..793621d --- /dev/null +++ b/data/teaching/blue-origin/passion-for-our-mission.json @@ -0,0 +1,16 @@ +{ + "id": 9001, + "slug": "passion-for-our-mission", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/practice-humility.json b/data/teaching/blue-origin/practice-humility.json new file mode 100644 index 0000000..caa910e --- /dev/null +++ b/data/teaching/blue-origin/practice-humility.json @@ -0,0 +1,16 @@ +{ + "id": 9013, + "slug": "practice-humility", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/resourceful.json b/data/teaching/blue-origin/resourceful.json new file mode 100644 index 0000000..b0b5ddf --- /dev/null +++ b/data/teaching/blue-origin/resourceful.json @@ -0,0 +1,16 @@ +{ + "id": 9005, + "slug": "resourceful", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/blue-origin/technical-ambition-and-simplicity.json b/data/teaching/blue-origin/technical-ambition-and-simplicity.json new file mode 100644 index 0000000..f74b50b --- /dev/null +++ b/data/teaching/blue-origin/technical-ambition-and-simplicity.json @@ -0,0 +1,16 @@ +{ + "id": 9012, + "slug": "technical-ambition-and-simplicity", + "blog": [ + { + "title": "Blue Origin Work Culture", + "url": "https://www.blueorigin.com/careers/work-culture", + "note": "The published wording of this principle." + }, + { + "title": "About Blue Origin", + "url": "https://www.blueorigin.com/about-blue", + "note": "The mission this principle is meant to serve." + } + ] +} diff --git a/data/teaching/coupang/aim-high-and-find-a-way.json b/data/teaching/coupang/aim-high-and-find-a-way.json new file mode 100644 index 0000000..e228b9e --- /dev/null +++ b/data/teaching/coupang/aim-high-and-find-a-way.json @@ -0,0 +1,11 @@ +{ + "id": 3011, + "slug": "aim-high-and-find-a-way", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/company-wide-perspective.json b/data/teaching/coupang/company-wide-perspective.json new file mode 100644 index 0000000..f0ae9f2 --- /dev/null +++ b/data/teaching/coupang/company-wide-perspective.json @@ -0,0 +1,11 @@ +{ + "id": 3003, + "slug": "company-wide-perspective", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/deliver-results-with-grit.json b/data/teaching/coupang/deliver-results-with-grit.json new file mode 100644 index 0000000..769c6e9 --- /dev/null +++ b/data/teaching/coupang/deliver-results-with-grit.json @@ -0,0 +1,11 @@ +{ + "id": 3009, + "slug": "deliver-results-with-grit", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/demand-excellence.json b/data/teaching/coupang/demand-excellence.json new file mode 100644 index 0000000..6fff5ac --- /dev/null +++ b/data/teaching/coupang/demand-excellence.json @@ -0,0 +1,11 @@ +{ + "id": 3013, + "slug": "demand-excellence", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/disagree-and-commit.json b/data/teaching/coupang/disagree-and-commit.json new file mode 100644 index 0000000..4d570fb --- /dev/null +++ b/data/teaching/coupang/disagree-and-commit.json @@ -0,0 +1,11 @@ +{ + "id": 3007, + "slug": "disagree-and-commit", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/dive-deep.json b/data/teaching/coupang/dive-deep.json new file mode 100644 index 0000000..c81c212 --- /dev/null +++ b/data/teaching/coupang/dive-deep.json @@ -0,0 +1,11 @@ +{ + "id": 3004, + "slug": "dive-deep", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/hate-waste.json b/data/teaching/coupang/hate-waste.json new file mode 100644 index 0000000..5e2bb07 --- /dev/null +++ b/data/teaching/coupang/hate-waste.json @@ -0,0 +1,11 @@ +{ + "id": 3015, + "slug": "hate-waste", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/hire-and-develop-the-best.json b/data/teaching/coupang/hire-and-develop-the-best.json new file mode 100644 index 0000000..8f2cfb1 --- /dev/null +++ b/data/teaching/coupang/hire-and-develop-the-best.json @@ -0,0 +1,11 @@ +{ + "id": 3008, + "slug": "hire-and-develop-the-best", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/index.json b/data/teaching/coupang/index.json new file mode 100644 index 0000000..1038fad --- /dev/null +++ b/data/teaching/coupang/index.json @@ -0,0 +1,88 @@ +{ + "title": "Coupang Leadership Principles", + "source": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "principles": [ + { + "id": 3001, + "slug": "wow-the-customer", + "file": "wow-the-customer.json" + }, + { + "id": 3002, + "slug": "ruthless-prioritization", + "file": "ruthless-prioritization.json" + }, + { + "id": 3003, + "slug": "company-wide-perspective", + "file": "company-wide-perspective.json" + }, + { + "id": 3004, + "slug": "dive-deep", + "file": "dive-deep.json" + }, + { + "id": 3005, + "slug": "think-systematically", + "file": "think-systematically.json" + }, + { + "id": 3006, + "slug": "simplify", + "file": "simplify.json" + }, + { + "id": 3007, + "slug": "disagree-and-commit", + "file": "disagree-and-commit.json" + }, + { + "id": 3008, + "slug": "hire-and-develop-the-best", + "file": "hire-and-develop-the-best.json" + }, + { + "id": 3009, + "slug": "deliver-results-with-grit", + "file": "deliver-results-with-grit.json" + }, + { + "id": 3010, + "slug": "influence-without-authority", + "file": "influence-without-authority.json" + }, + { + "id": 3011, + "slug": "aim-high-and-find-a-way", + "file": "aim-high-and-find-a-way.json" + }, + { + "id": 3012, + "slug": "learn-voraciously", + "file": "learn-voraciously.json" + }, + { + "id": 3013, + "slug": "demand-excellence", + "file": "demand-excellence.json" + }, + { + "id": 3014, + "slug": "move-with-urgency", + "file": "move-with-urgency.json" + }, + { + "id": 3015, + "slug": "hate-waste", + "file": "hate-waste.json" + } + ], + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published set. Fifteen principles, in the company's order." + } + ] +} diff --git a/data/teaching/coupang/influence-without-authority.json b/data/teaching/coupang/influence-without-authority.json new file mode 100644 index 0000000..c046275 --- /dev/null +++ b/data/teaching/coupang/influence-without-authority.json @@ -0,0 +1,11 @@ +{ + "id": 3010, + "slug": "influence-without-authority", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/learn-voraciously.json b/data/teaching/coupang/learn-voraciously.json new file mode 100644 index 0000000..63a5bf3 --- /dev/null +++ b/data/teaching/coupang/learn-voraciously.json @@ -0,0 +1,11 @@ +{ + "id": 3012, + "slug": "learn-voraciously", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/move-with-urgency.json b/data/teaching/coupang/move-with-urgency.json new file mode 100644 index 0000000..fd60562 --- /dev/null +++ b/data/teaching/coupang/move-with-urgency.json @@ -0,0 +1,11 @@ +{ + "id": 3014, + "slug": "move-with-urgency", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/ruthless-prioritization.json b/data/teaching/coupang/ruthless-prioritization.json new file mode 100644 index 0000000..2eb9ec2 --- /dev/null +++ b/data/teaching/coupang/ruthless-prioritization.json @@ -0,0 +1,11 @@ +{ + "id": 3002, + "slug": "ruthless-prioritization", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/simplify.json b/data/teaching/coupang/simplify.json new file mode 100644 index 0000000..ca52747 --- /dev/null +++ b/data/teaching/coupang/simplify.json @@ -0,0 +1,11 @@ +{ + "id": 3006, + "slug": "simplify", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/think-systematically.json b/data/teaching/coupang/think-systematically.json new file mode 100644 index 0000000..c33e05c --- /dev/null +++ b/data/teaching/coupang/think-systematically.json @@ -0,0 +1,11 @@ +{ + "id": 3005, + "slug": "think-systematically", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/coupang/wow-the-customer.json b/data/teaching/coupang/wow-the-customer.json new file mode 100644 index 0000000..33d10da --- /dev/null +++ b/data/teaching/coupang/wow-the-customer.json @@ -0,0 +1,11 @@ +{ + "id": 3001, + "slug": "wow-the-customer", + "blog": [ + { + "title": "Coupang Leadership Principles", + "url": "https://www.coupang.jobs/en/coupang-leadership-principles/", + "note": "The published wording of this principle." + } + ] +} diff --git a/data/teaching/dawn/better-than-yesterday.json b/data/teaching/dawn/better-than-yesterday.json new file mode 100644 index 0000000..43e18c5 --- /dev/null +++ b/data/teaching/dawn/better-than-yesterday.json @@ -0,0 +1,16 @@ +{ + "id": 6009, + "slug": "better-than-yesterday", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/bias-for-action.json b/data/teaching/dawn/bias-for-action.json new file mode 100644 index 0000000..ee04dfe --- /dev/null +++ b/data/teaching/dawn/bias-for-action.json @@ -0,0 +1,16 @@ +{ + "id": 6007, + "slug": "bias-for-action", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/break-down-silos.json b/data/teaching/dawn/break-down-silos.json new file mode 100644 index 0000000..4f186db --- /dev/null +++ b/data/teaching/dawn/break-down-silos.json @@ -0,0 +1,16 @@ +{ + "id": 6003, + "slug": "break-down-silos", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/customer-success-is-our-success.json b/data/teaching/dawn/customer-success-is-our-success.json new file mode 100644 index 0000000..ae4e0ab --- /dev/null +++ b/data/teaching/dawn/customer-success-is-our-success.json @@ -0,0 +1,16 @@ +{ + "id": 6002, + "slug": "customer-success-is-our-success", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/earn-trust.json b/data/teaching/dawn/earn-trust.json new file mode 100644 index 0000000..f655fd6 --- /dev/null +++ b/data/teaching/dawn/earn-trust.json @@ -0,0 +1,16 @@ +{ + "id": 6008, + "slug": "earn-trust", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/have-backbone-disagree-and-commit.json b/data/teaching/dawn/have-backbone-disagree-and-commit.json new file mode 100644 index 0000000..6d02965 --- /dev/null +++ b/data/teaching/dawn/have-backbone-disagree-and-commit.json @@ -0,0 +1,16 @@ +{ + "id": 6011, + "slug": "have-backbone-disagree-and-commit", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/hire-and-develop-the-best.json b/data/teaching/dawn/hire-and-develop-the-best.json new file mode 100644 index 0000000..4383f7d --- /dev/null +++ b/data/teaching/dawn/hire-and-develop-the-best.json @@ -0,0 +1,16 @@ +{ + "id": 6010, + "slug": "hire-and-develop-the-best", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/index.json b/data/teaching/dawn/index.json new file mode 100644 index 0000000..092cdb2 --- /dev/null +++ b/data/teaching/dawn/index.json @@ -0,0 +1,93 @@ +{ + "title": "Dawn Aerospace Company Tenets", + "source": "Dawn Aerospace Company Tenets, Dawn's internal wiki, published with Dawn's permission", + "principles": [ + { + "id": 6001, + "slug": "think-big-start-small", + "file": "think-big-start-small.json" + }, + { + "id": 6002, + "slug": "customer-success-is-our-success", + "file": "customer-success-is-our-success.json" + }, + { + "id": 6003, + "slug": "break-down-silos", + "file": "break-down-silos.json" + }, + { + "id": 6004, + "slug": "ownership", + "file": "ownership.json" + }, + { + "id": 6005, + "slug": "no-surprises", + "file": "no-surprises.json" + }, + { + "id": 6006, + "slug": "invent-and-simplify", + "file": "invent-and-simplify.json" + }, + { + "id": 6007, + "slug": "bias-for-action", + "file": "bias-for-action.json" + }, + { + "id": 6008, + "slug": "earn-trust", + "file": "earn-trust.json" + }, + { + "id": 6009, + "slug": "better-than-yesterday", + "file": "better-than-yesterday.json" + }, + { + "id": 6010, + "slug": "hire-and-develop-the-best", + "file": "hire-and-develop-the-best.json" + }, + { + "id": 6011, + "slug": "have-backbone-disagree-and-commit", + "file": "have-backbone-disagree-and-commit.json" + }, + { + "id": 6012, + "slug": "respect-time", + "file": "respect-time.json" + }, + { + "id": 6013, + "slug": "scrappy-not-crappy", + "file": "scrappy-not-crappy.json" + }, + { + "id": 6014, + "slug": "rocket-engineering-not-rocket-science", + "file": "rocket-engineering-not-rocket-science.json" + }, + { + "id": 6015, + "slug": "race-on-the-racetrack-walk-on-ice", + "file": "race-on-the-racetrack-walk-on-ice.json" + } + ], + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission statement. The tenets are first-party text published with permission." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company describes the work and the people it hires." + } + ] +} diff --git a/data/teaching/dawn/invent-and-simplify.json b/data/teaching/dawn/invent-and-simplify.json new file mode 100644 index 0000000..1d52534 --- /dev/null +++ b/data/teaching/dawn/invent-and-simplify.json @@ -0,0 +1,16 @@ +{ + "id": 6006, + "slug": "invent-and-simplify", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/no-surprises.json b/data/teaching/dawn/no-surprises.json new file mode 100644 index 0000000..83769e4 --- /dev/null +++ b/data/teaching/dawn/no-surprises.json @@ -0,0 +1,16 @@ +{ + "id": 6005, + "slug": "no-surprises", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/ownership.json b/data/teaching/dawn/ownership.json new file mode 100644 index 0000000..03f2ee3 --- /dev/null +++ b/data/teaching/dawn/ownership.json @@ -0,0 +1,16 @@ +{ + "id": 6004, + "slug": "ownership", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/race-on-the-racetrack-walk-on-ice.json b/data/teaching/dawn/race-on-the-racetrack-walk-on-ice.json new file mode 100644 index 0000000..5167eb4 --- /dev/null +++ b/data/teaching/dawn/race-on-the-racetrack-walk-on-ice.json @@ -0,0 +1,16 @@ +{ + "id": 6015, + "slug": "race-on-the-racetrack-walk-on-ice", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/respect-time.json b/data/teaching/dawn/respect-time.json new file mode 100644 index 0000000..a51dd30 --- /dev/null +++ b/data/teaching/dawn/respect-time.json @@ -0,0 +1,16 @@ +{ + "id": 6012, + "slug": "respect-time", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/rocket-engineering-not-rocket-science.json b/data/teaching/dawn/rocket-engineering-not-rocket-science.json new file mode 100644 index 0000000..4b710c3 --- /dev/null +++ b/data/teaching/dawn/rocket-engineering-not-rocket-science.json @@ -0,0 +1,16 @@ +{ + "id": 6014, + "slug": "rocket-engineering-not-rocket-science", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/scrappy-not-crappy.json b/data/teaching/dawn/scrappy-not-crappy.json new file mode 100644 index 0000000..7fa68eb --- /dev/null +++ b/data/teaching/dawn/scrappy-not-crappy.json @@ -0,0 +1,16 @@ +{ + "id": 6013, + "slug": "scrappy-not-crappy", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/dawn/think-big-start-small.json b/data/teaching/dawn/think-big-start-small.json new file mode 100644 index 0000000..b5508cc --- /dev/null +++ b/data/teaching/dawn/think-big-start-small.json @@ -0,0 +1,16 @@ +{ + "id": 6001, + "slug": "think-big-start-small", + "blog": [ + { + "title": "About Dawn Aerospace", + "url": "https://www.dawnaerospace.com/about", + "note": "The public mission this tenet is meant to serve." + }, + { + "title": "Careers at Dawn Aerospace", + "url": "https://www.dawnaerospace.com/careers", + "note": "How the company presents the work to people who would live this tenet." + } + ] +} diff --git a/data/teaching/delivery-hero/bring-good-vibes.json b/data/teaching/delivery-hero/bring-good-vibes.json new file mode 100644 index 0000000..074b327 --- /dev/null +++ b/data/teaching/delivery-hero/bring-good-vibes.json @@ -0,0 +1,16 @@ +{ + "id": 4004, + "slug": "bring-good-vibes", + "blog": [ + { + "title": "Launching Our Leadership Principles, Delivery Hero", + "url": "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles", + "note": "The published wording of this principle." + }, + { + "title": "Delivery Hero Careers", + "url": "https://careers.deliveryhero.com/", + "note": "How the company presents the culture this principle is part of." + } + ] +} diff --git a/data/teaching/delivery-hero/deliver-value-fast.json b/data/teaching/delivery-hero/deliver-value-fast.json new file mode 100644 index 0000000..aaf6337 --- /dev/null +++ b/data/teaching/delivery-hero/deliver-value-fast.json @@ -0,0 +1,16 @@ +{ + "id": 4003, + "slug": "deliver-value-fast", + "blog": [ + { + "title": "Launching Our Leadership Principles, Delivery Hero", + "url": "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles", + "note": "The published wording of this principle." + }, + { + "title": "Delivery Hero Careers", + "url": "https://careers.deliveryhero.com/", + "note": "How the company presents the culture this principle is part of." + } + ] +} diff --git a/data/teaching/delivery-hero/dive-deep.json b/data/teaching/delivery-hero/dive-deep.json new file mode 100644 index 0000000..bdb8f76 --- /dev/null +++ b/data/teaching/delivery-hero/dive-deep.json @@ -0,0 +1,16 @@ +{ + "id": 4002, + "slug": "dive-deep", + "blog": [ + { + "title": "Launching Our Leadership Principles, Delivery Hero", + "url": "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles", + "note": "The published wording of this principle." + }, + { + "title": "Delivery Hero Careers", + "url": "https://careers.deliveryhero.com/", + "note": "How the company presents the culture this principle is part of." + } + ] +} diff --git a/data/teaching/delivery-hero/index.json b/data/teaching/delivery-hero/index.json new file mode 100644 index 0000000..1bb95ee --- /dev/null +++ b/data/teaching/delivery-hero/index.json @@ -0,0 +1,48 @@ +{ + "title": "Delivery Hero Leadership Principles", + "source": "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles", + "principles": [ + { + "id": 4001, + "slug": "own-it", + "file": "own-it.json" + }, + { + "id": 4002, + "slug": "dive-deep", + "file": "dive-deep.json" + }, + { + "id": 4003, + "slug": "deliver-value-fast", + "file": "deliver-value-fast.json" + }, + { + "id": 4004, + "slug": "bring-good-vibes", + "file": "bring-good-vibes.json" + }, + { + "id": 4005, + "slug": "raise-the-bar", + "file": "raise-the-bar.json" + }, + { + "id": 4006, + "slug": "stay-humble", + "file": "stay-humble.json" + } + ], + "blog": [ + { + "title": "Launching Our Leadership Principles, Delivery Hero", + "url": "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles", + "note": "The published announcement of the six principles." + }, + { + "title": "Delivery Hero Careers", + "url": "https://careers.deliveryhero.com/", + "note": "The careers home for the culture those principles describe." + } + ] +} diff --git a/data/teaching/delivery-hero/own-it.json b/data/teaching/delivery-hero/own-it.json new file mode 100644 index 0000000..c3cc418 --- /dev/null +++ b/data/teaching/delivery-hero/own-it.json @@ -0,0 +1,16 @@ +{ + "id": 4001, + "slug": "own-it", + "blog": [ + { + "title": "Launching Our Leadership Principles, Delivery Hero", + "url": "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles", + "note": "The published wording of this principle." + }, + { + "title": "Delivery Hero Careers", + "url": "https://careers.deliveryhero.com/", + "note": "How the company presents the culture this principle is part of." + } + ] +} diff --git a/data/teaching/delivery-hero/raise-the-bar.json b/data/teaching/delivery-hero/raise-the-bar.json new file mode 100644 index 0000000..788b3ce --- /dev/null +++ b/data/teaching/delivery-hero/raise-the-bar.json @@ -0,0 +1,16 @@ +{ + "id": 4005, + "slug": "raise-the-bar", + "blog": [ + { + "title": "Launching Our Leadership Principles, Delivery Hero", + "url": "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles", + "note": "The published wording of this principle." + }, + { + "title": "Delivery Hero Careers", + "url": "https://careers.deliveryhero.com/", + "note": "How the company presents the culture this principle is part of." + } + ] +} diff --git a/data/teaching/delivery-hero/stay-humble.json b/data/teaching/delivery-hero/stay-humble.json new file mode 100644 index 0000000..c2a80d4 --- /dev/null +++ b/data/teaching/delivery-hero/stay-humble.json @@ -0,0 +1,16 @@ +{ + "id": 4006, + "slug": "stay-humble", + "blog": [ + { + "title": "Launching Our Leadership Principles, Delivery Hero", + "url": "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles", + "note": "The published wording of this principle." + }, + { + "title": "Delivery Hero Careers", + "url": "https://careers.deliveryhero.com/", + "note": "How the company presents the culture this principle is part of." + } + ] +} diff --git a/data/teaching/gitlab/collaboration.json b/data/teaching/gitlab/collaboration.json new file mode 100644 index 0000000..49dd298 --- /dev/null +++ b/data/teaching/gitlab/collaboration.json @@ -0,0 +1,16 @@ +{ + "id": 5001, + "slug": "collaboration", + "blog": [ + { + "title": "GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/", + "note": "The published CREDIT values this principle belongs to." + }, + { + "title": "Collaboration, GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/#collaboration", + "note": "The Collaboration value, first in CREDIT." + } + ] +} diff --git a/data/teaching/gitlab/diversity-inclusion-and-belonging.json b/data/teaching/gitlab/diversity-inclusion-and-belonging.json new file mode 100644 index 0000000..2a2e2b8 --- /dev/null +++ b/data/teaching/gitlab/diversity-inclusion-and-belonging.json @@ -0,0 +1,16 @@ +{ + "id": 5004, + "slug": "diversity-inclusion-and-belonging", + "blog": [ + { + "title": "GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/", + "note": "The published CREDIT values this principle belongs to." + }, + { + "title": "Diversity, Inclusion & Belonging, GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/#diversity-inclusion", + "note": "The Diversity, Inclusion, and Belonging value, fourth in CREDIT." + } + ] +} diff --git a/data/teaching/gitlab/efficiency.json b/data/teaching/gitlab/efficiency.json new file mode 100644 index 0000000..43a8c26 --- /dev/null +++ b/data/teaching/gitlab/efficiency.json @@ -0,0 +1,16 @@ +{ + "id": 5003, + "slug": "efficiency", + "blog": [ + { + "title": "GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/", + "note": "The published CREDIT values this principle belongs to." + }, + { + "title": "Efficiency, GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/#efficiency", + "note": "The Efficiency value, third in CREDIT." + } + ] +} diff --git a/data/teaching/gitlab/index.json b/data/teaching/gitlab/index.json new file mode 100644 index 0000000..cfe5269 --- /dev/null +++ b/data/teaching/gitlab/index.json @@ -0,0 +1,43 @@ +{ + "title": "GitLab CREDIT Values", + "source": "https://handbook.gitlab.com/handbook/values/", + "principles": [ + { + "id": 5001, + "slug": "collaboration", + "file": "collaboration.json" + }, + { + "id": 5002, + "slug": "results-for-customers", + "file": "results-for-customers.json" + }, + { + "id": 5003, + "slug": "efficiency", + "file": "efficiency.json" + }, + { + "id": 5004, + "slug": "diversity-inclusion-and-belonging", + "file": "diversity-inclusion-and-belonging.json" + }, + { + "id": 5005, + "slug": "iteration", + "file": "iteration.json" + }, + { + "id": 5006, + "slug": "transparency", + "file": "transparency.json" + } + ], + "blog": [ + { + "title": "GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/", + "note": "The published CREDIT values. Six values, in the order that spells CREDIT." + } + ] +} diff --git a/data/teaching/gitlab/iteration.json b/data/teaching/gitlab/iteration.json new file mode 100644 index 0000000..d13cb69 --- /dev/null +++ b/data/teaching/gitlab/iteration.json @@ -0,0 +1,16 @@ +{ + "id": 5005, + "slug": "iteration", + "blog": [ + { + "title": "GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/", + "note": "The published CREDIT values this principle belongs to." + }, + { + "title": "Iteration, GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/#iteration", + "note": "The Iteration value, fifth in CREDIT." + } + ] +} diff --git a/data/teaching/gitlab/results-for-customers.json b/data/teaching/gitlab/results-for-customers.json new file mode 100644 index 0000000..4ac35b8 --- /dev/null +++ b/data/teaching/gitlab/results-for-customers.json @@ -0,0 +1,16 @@ +{ + "id": 5002, + "slug": "results-for-customers", + "blog": [ + { + "title": "GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/", + "note": "The published CREDIT values this principle belongs to." + }, + { + "title": "Results for Customers, GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/#results", + "note": "The Results for Customers value, second in CREDIT." + } + ] +} diff --git a/data/teaching/gitlab/transparency.json b/data/teaching/gitlab/transparency.json new file mode 100644 index 0000000..8153ea8 --- /dev/null +++ b/data/teaching/gitlab/transparency.json @@ -0,0 +1,16 @@ +{ + "id": 5006, + "slug": "transparency", + "blog": [ + { + "title": "GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/", + "note": "The published CREDIT values this principle belongs to." + }, + { + "title": "Transparency, GitLab Values", + "url": "https://handbook.gitlab.com/handbook/values/#transparency", + "note": "The Transparency value, last in CREDIT." + } + ] +} diff --git a/data/teaching/toyota/challenge.json b/data/teaching/toyota/challenge.json new file mode 100644 index 0000000..86bac67 --- /dev/null +++ b/data/teaching/toyota/challenge.json @@ -0,0 +1,16 @@ +{ + "id": 7001, + "slug": "challenge", + "blog": [ + { + "title": "Toyota Way 2001", + "url": "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/toyotaway2001.html", + "note": "Challenge, under Continuous Improvement." + }, + { + "title": "Toyota Annual Report 2018, the Toyota Way keywords", + "url": "https://www.toyota-global.com/pages/contents/investors/ir_library/annual/pdf/2018/ar18_3_en.pdf", + "note": "The first-party wording of this keyword. Page 29." + } + ] +} diff --git a/data/teaching/toyota/genchi-genbutsu.json b/data/teaching/toyota/genchi-genbutsu.json new file mode 100644 index 0000000..48338c4 --- /dev/null +++ b/data/teaching/toyota/genchi-genbutsu.json @@ -0,0 +1,16 @@ +{ + "id": 7003, + "slug": "genchi-genbutsu", + "blog": [ + { + "title": "Toyota Way 2001", + "url": "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/toyotaway2001.html", + "note": "Genchi Genbutsu, under Continuous Improvement." + }, + { + "title": "Toyota Annual Report 2018, the Toyota Way keywords", + "url": "https://www.toyota-global.com/pages/contents/investors/ir_library/annual/pdf/2018/ar18_3_en.pdf", + "note": "The first-party wording of this keyword. Page 29." + } + ] +} diff --git a/data/teaching/toyota/index.json b/data/teaching/toyota/index.json new file mode 100644 index 0000000..2039e6b --- /dev/null +++ b/data/teaching/toyota/index.json @@ -0,0 +1,48 @@ +{ + "title": "The Toyota Way", + "source": "https://www.toyota-global.com/pages/contents/investors/ir_library/annual/pdf/2018/ar18_3_en.pdf", + "principles": [ + { + "id": 7001, + "slug": "challenge", + "file": "challenge.json" + }, + { + "id": 7002, + "slug": "kaizen", + "file": "kaizen.json" + }, + { + "id": 7003, + "slug": "genchi-genbutsu", + "file": "genchi-genbutsu.json" + }, + { + "id": 7004, + "slug": "respect", + "file": "respect.json" + }, + { + "id": 7005, + "slug": "teamwork", + "file": "teamwork.json" + } + ], + "blog": [ + { + "title": "Toyota Way 2001", + "url": "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/toyotaway2001.html", + "note": "The official page for the two pillars and the five keywords." + }, + { + "title": "Toyota Annual Report 2018, the Toyota Way keywords", + "url": "https://www.toyota-global.com/pages/contents/investors/ir_library/annual/pdf/2018/ar18_3_en.pdf", + "note": "The first-party text that states each keyword. Page 29." + }, + { + "title": "Toyota Corporate Philosophy", + "url": "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/index.html", + "note": "The philosophy index that places that set next to the Guiding Principles." + } + ] +} diff --git a/data/teaching/toyota/kaizen.json b/data/teaching/toyota/kaizen.json new file mode 100644 index 0000000..b2d2c10 --- /dev/null +++ b/data/teaching/toyota/kaizen.json @@ -0,0 +1,16 @@ +{ + "id": 7002, + "slug": "kaizen", + "blog": [ + { + "title": "Toyota Way 2001", + "url": "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/toyotaway2001.html", + "note": "Kaizen, under Continuous Improvement." + }, + { + "title": "Toyota Annual Report 2018, the Toyota Way keywords", + "url": "https://www.toyota-global.com/pages/contents/investors/ir_library/annual/pdf/2018/ar18_3_en.pdf", + "note": "The first-party wording of this keyword. Page 29." + } + ] +} diff --git a/data/teaching/toyota/respect.json b/data/teaching/toyota/respect.json new file mode 100644 index 0000000..b2c00a0 --- /dev/null +++ b/data/teaching/toyota/respect.json @@ -0,0 +1,16 @@ +{ + "id": 7004, + "slug": "respect", + "blog": [ + { + "title": "Toyota Way 2001", + "url": "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/toyotaway2001.html", + "note": "Respect, under Respect for People." + }, + { + "title": "Toyota Annual Report 2018, the Toyota Way keywords", + "url": "https://www.toyota-global.com/pages/contents/investors/ir_library/annual/pdf/2018/ar18_3_en.pdf", + "note": "The first-party wording of this keyword. Page 29." + } + ] +} diff --git a/data/teaching/toyota/teamwork.json b/data/teaching/toyota/teamwork.json new file mode 100644 index 0000000..0d58193 --- /dev/null +++ b/data/teaching/toyota/teamwork.json @@ -0,0 +1,16 @@ +{ + "id": 7005, + "slug": "teamwork", + "blog": [ + { + "title": "Toyota Way 2001", + "url": "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/toyotaway2001.html", + "note": "Teamwork, under Respect for People." + }, + { + "title": "Toyota Annual Report 2018, the Toyota Way keywords", + "url": "https://www.toyota-global.com/pages/contents/investors/ir_library/annual/pdf/2018/ar18_3_en.pdf", + "note": "The first-party wording of this keyword. Page 29." + } + ] +} diff --git a/data/teaching/usmc/be-technically-and-tactically-proficient.json b/data/teaching/usmc/be-technically-and-tactically-proficient.json new file mode 100644 index 0000000..90eff43 --- /dev/null +++ b/data/teaching/usmc/be-technically-and-tactically-proficient.json @@ -0,0 +1,21 @@ +{ + "id": 10002, + "slug": "be-technically-and-tactically-proficient", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "Marine Leader Development, Marine Corps University", + "url": "https://www.usmcu.edu/Academic-Programs/Lejeune-Leadership-Institute/Marine-Leader-Development/", + "note": "The Fighter functional area. Technical and tactical proficiency is trained, not assumed." + } + ] +} diff --git a/data/teaching/usmc/develop-a-sense-of-responsibility-in-your-subordinates.json b/data/teaching/usmc/develop-a-sense-of-responsibility-in-your-subordinates.json new file mode 100644 index 0000000..30bacf4 --- /dev/null +++ b/data/teaching/usmc/develop-a-sense-of-responsibility-in-your-subordinates.json @@ -0,0 +1,21 @@ +{ + "id": 10009, + "slug": "develop-a-sense-of-responsibility-in-your-subordinates", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "Marine Leader Development, Marine Corps University", + "url": "https://www.usmcu.edu/Academic-Programs/Lejeune-Leadership-Institute/Marine-Leader-Development/", + "note": "Leaders teach, coach, counsel, and mentor so subordinates can take the next load." + } + ] +} diff --git a/data/teaching/usmc/employ-your-unit-in-accordance-with-its-capabilities.json b/data/teaching/usmc/employ-your-unit-in-accordance-with-its-capabilities.json new file mode 100644 index 0000000..f3ea020 --- /dev/null +++ b/data/teaching/usmc/employ-your-unit-in-accordance-with-its-capabilities.json @@ -0,0 +1,21 @@ +{ + "id": 10010, + "slug": "employ-your-unit-in-accordance-with-its-capabilities", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "MCDP 6 Command and Control", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/898678/mcdp-6/", + "note": "Employment has to match what the unit can actually do, not what a plan assumes." + } + ] +} diff --git a/data/teaching/usmc/ensure-the-task-is-understood-supervised-and-accomplished.json b/data/teaching/usmc/ensure-the-task-is-understood-supervised-and-accomplished.json new file mode 100644 index 0000000..fc05dfa --- /dev/null +++ b/data/teaching/usmc/ensure-the-task-is-understood-supervised-and-accomplished.json @@ -0,0 +1,21 @@ +{ + "id": 10006, + "slug": "ensure-the-task-is-understood-supervised-and-accomplished", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "MCDP 6 Command and Control", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/898678/mcdp-6/", + "note": "Mission command still requires the task to be understood and the result confirmed." + } + ] +} diff --git a/data/teaching/usmc/index.json b/data/teaching/usmc/index.json index ec7b554..4e68a5c 100644 --- a/data/teaching/usmc/index.json +++ b/data/teaching/usmc/index.json @@ -1,7 +1,63 @@ { "title": "U.S. Marine Corps Leadership Principles", - "source": "TECOM / The Basic School Officership Foundations handout. Set-level Further reading only. No principle teaching files.", - "principles": [], + "source": "TECOM / The Basic School Officership Foundations handout. Further reading from official Marine Corps publications.", + "principles": [ + { + "id": 10001, + "slug": "know-yourself-and-seek-self-improvement", + "file": "know-yourself-and-seek-self-improvement.json" + }, + { + "id": 10002, + "slug": "be-technically-and-tactically-proficient", + "file": "be-technically-and-tactically-proficient.json" + }, + { + "id": 10003, + "slug": "know-your-marines-and-look-out-for-their-welfare", + "file": "know-your-marines-and-look-out-for-their-welfare.json" + }, + { + "id": 10004, + "slug": "keep-your-marines-informed", + "file": "keep-your-marines-informed.json" + }, + { + "id": 10005, + "slug": "set-the-example", + "file": "set-the-example.json" + }, + { + "id": 10006, + "slug": "ensure-the-task-is-understood-supervised-and-accomplished", + "file": "ensure-the-task-is-understood-supervised-and-accomplished.json" + }, + { + "id": 10007, + "slug": "train-your-marines-as-a-team", + "file": "train-your-marines-as-a-team.json" + }, + { + "id": 10008, + "slug": "make-sound-and-timely-decisions", + "file": "make-sound-and-timely-decisions.json" + }, + { + "id": 10009, + "slug": "develop-a-sense-of-responsibility-in-your-subordinates", + "file": "develop-a-sense-of-responsibility-in-your-subordinates.json" + }, + { + "id": 10010, + "slug": "employ-your-unit-in-accordance-with-its-capabilities", + "file": "employ-your-unit-in-accordance-with-its-capabilities.json" + }, + { + "id": 10011, + "slug": "seek-responsibility-and-take-responsibility-for-your-actions", + "file": "seek-responsibility-and-take-responsibility-for-your-actions.json" + } + ], "blog": [ { "title": "Leadership Traits", @@ -12,6 +68,41 @@ "title": "Officership Foundations, The Basic School", "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", "note": "The published source for the 11 principles, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "The warfighting publication on ethos, traits, and the leadership principles." + }, + { + "title": "MCDP 6 Command and Control", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/898678/mcdp-6/", + "note": "The doctrinal publication on deciding and acting faster than an adversary." + }, + { + "title": "Leading Marines, Sergeant Major of the Marine Corps", + "url": "https://www.smmc.marines.mil/Leading-Marines/", + "note": "The official page for the publication meant to be read cover to cover." + }, + { + "title": "Lejeune Leadership Institute, Marine Corps University", + "url": "https://www.usmcu.edu/LLI", + "note": "The institute that writes leadership education for the total force." + }, + { + "title": "Marine Leader Development, Marine Corps University", + "url": "https://www.usmcu.edu/Academic-Programs/Lejeune-Leadership-Institute/Marine-Leader-Development/", + "note": "The framework for teaching, coaching, counseling, and mentoring." + }, + { + "title": "Commandant's Professional Reading List", + "url": "https://grc-usmcu.libguides.com/cmc-reading-list", + "note": "The official reading program. Professional self-study from this list." + }, + { + "title": "Commandant's Professional Reading List, Lejeune Leadership Institute", + "url": "https://www.usmcu.edu/Academic-Programs/Lejeune-Leadership-Institute/LLI-Professional-Reading-List/", + "note": "The institute page that hosts the current list and the archive." } ] } diff --git a/data/teaching/usmc/keep-your-marines-informed.json b/data/teaching/usmc/keep-your-marines-informed.json new file mode 100644 index 0000000..2e35f50 --- /dev/null +++ b/data/teaching/usmc/keep-your-marines-informed.json @@ -0,0 +1,21 @@ +{ + "id": 10004, + "slug": "keep-your-marines-informed", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "MCDP 6 Command and Control", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/898678/mcdp-6/", + "note": "Command and control depends on shared understanding, not on holding information." + } + ] +} diff --git a/data/teaching/usmc/know-your-marines-and-look-out-for-their-welfare.json b/data/teaching/usmc/know-your-marines-and-look-out-for-their-welfare.json new file mode 100644 index 0000000..1298aca --- /dev/null +++ b/data/teaching/usmc/know-your-marines-and-look-out-for-their-welfare.json @@ -0,0 +1,21 @@ +{ + "id": 10003, + "slug": "know-your-marines-and-look-out-for-their-welfare", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "Marine Leader Development, Marine Corps University", + "url": "https://www.usmcu.edu/Academic-Programs/Lejeune-Leadership-Institute/Marine-Leader-Development/", + "note": "The framework for knowing the people you lead across the six functional areas, including family and fitness." + } + ] +} diff --git a/data/teaching/usmc/know-yourself-and-seek-self-improvement.json b/data/teaching/usmc/know-yourself-and-seek-self-improvement.json new file mode 100644 index 0000000..0ded045 --- /dev/null +++ b/data/teaching/usmc/know-yourself-and-seek-self-improvement.json @@ -0,0 +1,21 @@ +{ + "id": 10001, + "slug": "know-yourself-and-seek-self-improvement", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "Leadership Traits", + "url": "https://www.mcjrotc.marines.mil/About/Leadership-Traits/", + "note": "The 14 traits this principle uses to name strengths and weaknesses." + } + ] +} diff --git a/data/teaching/usmc/make-sound-and-timely-decisions.json b/data/teaching/usmc/make-sound-and-timely-decisions.json new file mode 100644 index 0000000..8889ea7 --- /dev/null +++ b/data/teaching/usmc/make-sound-and-timely-decisions.json @@ -0,0 +1,21 @@ +{ + "id": 10008, + "slug": "make-sound-and-timely-decisions", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "MCDP 6 Command and Control", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/898678/mcdp-6/", + "note": "The doctrine for reaching a sound decision faster than the other side." + } + ] +} diff --git a/data/teaching/usmc/seek-responsibility-and-take-responsibility-for-your-actions.json b/data/teaching/usmc/seek-responsibility-and-take-responsibility-for-your-actions.json new file mode 100644 index 0000000..9450a27 --- /dev/null +++ b/data/teaching/usmc/seek-responsibility-and-take-responsibility-for-your-actions.json @@ -0,0 +1,21 @@ +{ + "id": 10011, + "slug": "seek-responsibility-and-take-responsibility-for-your-actions", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "Leading Marines, Sergeant Major of the Marine Corps", + "url": "https://www.smmc.marines.mil/Leading-Marines/", + "note": "Seeking responsibility, and owning the result, is in the foundations of that publication." + } + ] +} diff --git a/data/teaching/usmc/set-the-example.json b/data/teaching/usmc/set-the-example.json new file mode 100644 index 0000000..e74655f --- /dev/null +++ b/data/teaching/usmc/set-the-example.json @@ -0,0 +1,21 @@ +{ + "id": 10005, + "slug": "set-the-example", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "Leading Marines, Sergeant Major of the Marine Corps", + "url": "https://www.smmc.marines.mil/Leading-Marines/", + "note": "Setting the example is in the foundations chapter of that publication." + } + ] +} diff --git a/data/teaching/usmc/train-your-marines-as-a-team.json b/data/teaching/usmc/train-your-marines-as-a-team.json new file mode 100644 index 0000000..0d64a23 --- /dev/null +++ b/data/teaching/usmc/train-your-marines-as-a-team.json @@ -0,0 +1,21 @@ +{ + "id": 10007, + "slug": "train-your-marines-as-a-team", + "blog": [ + { + "title": "Officership Foundations, The Basic School", + "url": "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf", + "note": "The published wording of this principle, in numbered doctrine order." + }, + { + "title": "MCWP 6-10 Leading Marines", + "url": "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/", + "note": "Doctrine that covers the leadership principles and the traits they rest on." + }, + { + "title": "Marine Leader Development, Marine Corps University", + "url": "https://www.usmcu.edu/Academic-Programs/Lejeune-Leadership-Institute/Marine-Leader-Development/", + "note": "Development is a team of leaders, not a single counselor on a form." + } + ] +} diff --git a/scripts/validate.py b/scripts/validate.py index 0b101b8..dbbe756 100755 --- a/scripts/validate.py +++ b/scripts/validate.py @@ -642,8 +642,12 @@ def validate_teaching(by_company, errs, root=None): A catalog principles list may be empty. A listed file has to exist in that directory, and a slug is listed once. index is reserved for the catalog. When the catalog exists, a teaching file other than - the catalog has to be listed. - root is for tests; the corpus uses DATA. + the catalog has to be listed. A principle file with only id, slug, + and blog is Further reading without teaching prose. Any other + teaching field requires the full prose shape. + root is for tests; the corpus uses DATA. When root is omitted the + live tree must have a catalog and a teaching file for every + principle, or the apps render no Further reading for that set. """ catalog, catalog_err = essay_links.load_catalog() if catalog_err: @@ -651,6 +655,9 @@ def validate_teaching(by_company, errs, root=None): catalog = None teaching = os.path.join(root or DATA, "teaching") if not os.path.isdir(teaching): + if root is None: + errs.append("data/teaching: missing") + require_teaching_coverage(by_company, teaching, errs) return for company in sorted(os.listdir(teaching)): cdir = os.path.join(teaching, company) @@ -731,7 +738,9 @@ def validate_teaching(by_company, errs, root=None): errs.append("%s: {lp:%s} does not resolve" % (where, tok)) continue teaching_stems.append(filename[:-5]) - validate_teaching_shape(doc, where, errs) + extra = set(doc.keys()) - {"id", "slug", "blog"} + if extra: + validate_teaching_shape(doc, where, errs) validate_blog(doc.get("blog"), where, errs) stem = filename[:-5] if doc.get("slug") != stem: @@ -773,6 +782,30 @@ def validate_teaching(by_company, errs, root=None): if stem not in listed_slugs: errs.append("data/teaching/%s/%s.json: not listed in the catalog" % (company, stem)) + if root is None: + require_teaching_coverage(by_company, teaching, errs) + + +def require_teaching_coverage(by_company, teaching_root, errs): + """The live corpus needs a catalog and a teaching file for every principle. + + A fixture may omit files. The apps only render Further reading from a + file that exists, so a missing catalog is a silent empty section. + """ + for company, items in by_company.items(): + cdir = os.path.join(teaching_root, company) + idx = os.path.join(cdir, "index.json") + if not os.path.isfile(idx): + errs.append("data/teaching/%s/index.json: missing" % company) + continue + have = set() + for name in os.listdir(cdir): + if name.endswith(".json") and name != "index.json": + have.add(name[:-5]) + for _, rec in items: + slug = rec.get("slug") + if isinstance(slug, str) and slug not in have: + errs.append("data/teaching/%s/%s.json: missing" % (company, slug)) def _record_by_id(by_company, company): diff --git a/tests/test_reading.py b/tests/test_reading.py index 705c8a5..451bcb2 100644 --- a/tests/test_reading.py +++ b/tests/test_reading.py @@ -10,7 +10,8 @@ Amazon is the classic 14. Any Company reuses those lists, and authors Intentional About Culture because that counterpart is not in this corpus. The generic catalog and Intentional About Culture also append culture -reading that is not on the Amazon copies. +reading that is not on the Amazon copies. Every other company ships a +catalog and one reading-only file per principle. """ import json @@ -18,13 +19,17 @@ import unittest from urllib.parse import urlparse -TEACH = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), - "data", "teaching") +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +TEACH = os.path.join(ROOT, "data", "teaching") +INDEX = os.path.join(ROOT, "data", "index.json") BLOG_HOST = "blog.kindel.com" -# Amazon: 14 principle files plus the set index. Any Company adds -# Intentional About Culture, which has no file to copy. USMC is the -# set catalog only: Further reading for the 14 traits, no principle files. -EXPECTED = {"amazon": 15, "generic": 16, "usmc": 1} + + +def expected_counts(): + """One catalog plus one teaching file per principle, for every company.""" + with open(INDEX, encoding="utf-8") as f: + idx = json.load(f) + return {co["id"]: 1 + len(co["principles"]) for co in idx["companies"]} def is_tig(url): @@ -42,7 +47,7 @@ def is_tig(url): def lists(company=None): - companies = [company] if company else list(EXPECTED) + companies = [company] if company else list(expected_counts()) for company in companies: d = os.path.join(TEACH, company) for name in sorted(os.listdir(d)): @@ -54,7 +59,7 @@ def lists(company=None): class FurtherReadingTest(unittest.TestCase): def test_every_list_has_an_external_source(self): - for company, want in EXPECTED.items(): + for company, want in expected_counts().items(): seen = 0 for name, items in lists(company): seen += 1 @@ -145,6 +150,82 @@ def test_generic_culture_cites(self): for url, title in expected.items(): self.assertEqual(seen[url], 2, title) + def test_company_set_cites(self): + # Official set pages. Titles name the work, and the source when the + # heading is only a short label. Every URL on a company set other + # than Amazon and the universal set must be in this list. + expected = { + "https://careers.arm.com/life-at-arm": + "Life at Arm", + "https://www.arm.com/company": + "Arm Company", + "https://www.coupang.jobs/en/coupang-leadership-principles/": + "Coupang Leadership Principles", + "https://careers.deliveryhero.com/delivery-hero/2025-4/launching-our-leadership-principles": + "Launching Our Leadership Principles, Delivery Hero", + "https://careers.deliveryhero.com/": + "Delivery Hero Careers", + "https://handbook.gitlab.com/handbook/values/": + "GitLab Values", + "https://handbook.gitlab.com/handbook/values/#collaboration": + "Collaboration, GitLab Values", + "https://handbook.gitlab.com/handbook/values/#results": + "Results for Customers, GitLab Values", + "https://handbook.gitlab.com/handbook/values/#efficiency": + "Efficiency, GitLab Values", + "https://handbook.gitlab.com/handbook/values/#diversity-inclusion": + "Diversity, Inclusion & Belonging, GitLab Values", + "https://handbook.gitlab.com/handbook/values/#iteration": + "Iteration, GitLab Values", + "https://handbook.gitlab.com/handbook/values/#transparency": + "Transparency, GitLab Values", + "https://www.dawnaerospace.com/about": + "About Dawn Aerospace", + "https://www.dawnaerospace.com/careers": + "Careers at Dawn Aerospace", + "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/toyotaway2001.html": + "Toyota Way 2001", + "https://www.toyota-global.com/pages/contents/investors/ir_library/annual/pdf/2018/ar18_3_en.pdf": + "Toyota Annual Report 2018, the Toyota Way keywords", + "https://www.toyota-global.com/company/history_of_toyota/75years/data/conditions/philosophy/index.html": + "Toyota Corporate Philosophy", + "https://www.blueorigin.com/careers/work-culture": + "Blue Origin Work Culture", + "https://www.blueorigin.com/about-blue": + "About Blue Origin", + "https://www.mcjrotc.marines.mil/About/Leadership-Traits/": + "Leadership Traits", + "https://www.trngcmd.marines.mil/Portals/207/Site%20Images/TBS/B1X0099XQ%20Officership%20Foundations.pdf": + "Officership Foundations, The Basic School", + "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/899578/mcwp-6-10/": + "MCWP 6-10 Leading Marines", + "https://www.marines.mil/News/Publications/MCPEL/Electronic-Library-Display/Article/898678/mcdp-6/": + "MCDP 6 Command and Control", + "https://www.smmc.marines.mil/Leading-Marines/": + "Leading Marines, Sergeant Major of the Marine Corps", + "https://www.usmcu.edu/LLI": + "Lejeune Leadership Institute, Marine Corps University", + "https://www.usmcu.edu/Academic-Programs/Lejeune-Leadership-Institute/Marine-Leader-Development/": + "Marine Leader Development, Marine Corps University", + "https://grc-usmcu.libguides.com/cmc-reading-list": + "Commandant's Professional Reading List", + "https://www.usmcu.edu/Academic-Programs/Lejeune-Leadership-Institute/LLI-Professional-Reading-List/": + "Commandant's Professional Reading List, Lejeune Leadership Institute", + } + seen = {url: 0 for url in expected} + for name, items in lists(): + if name.split("/", 1)[0] in ("amazon", "generic"): + continue + for item in items or []: + url = item["url"] + with self.subTest(file=name, url=url): + self.assertIn(url, expected, "unexpected official URL") + self.assertEqual(item["title"], expected[url]) + self.assertNotIn("\u2014", item["note"]) + seen[url] += 1 + for url, title in expected.items(): + self.assertGreater(seen[url], 0, title) + def test_no_duplicate_urls_in_a_list(self): for name, items in lists(): urls = [i["url"] for i in items or []] diff --git a/tests/test_validate.py b/tests/test_validate.py index bded221..430c830 100644 --- a/tests/test_validate.py +++ b/tests/test_validate.py @@ -24,9 +24,11 @@ from companies import COMPANY_META import essay_links +import validate from validate import (expected_index, load_facets, load_records, validate_company, validate_calibration_coverage, validate_derivation_maps, - validate_facets, validate_record, validate_teaching) + validate_facets, validate_record, validate_teaching, + require_teaching_coverage) def row(i, **kw): @@ -570,6 +572,77 @@ def test_a_good_teaching_file_passes(self): self.write(root, "customer-obsession.json", self.good()) self.assertEqual([], self.check(root)) + def test_a_reading_only_teaching_file_passes(self): + with tempfile.TemporaryDirectory() as root: + self.write(root, "customer-obsession.json", { + "id": 1001, + "slug": "customer-obsession", + "blog": self.reading(), + }) + self.assertEqual([], self.check(root)) + + def test_a_reading_only_file_still_needs_blog(self): + with tempfile.TemporaryDirectory() as root: + self.write(root, "customer-obsession.json", { + "id": 1001, + "slug": "customer-obsession", + }) + errs = self.check(root) + self.assertTrue(any("blog must be a non-empty list" in e for e in errs), errs) + + def test_a_partial_prose_file_is_not_reading_only(self): + with tempfile.TemporaryDirectory() as root: + self.write(root, "customer-obsession.json", { + "id": 1001, + "slug": "customer-obsession", + "why": ["One paragraph.", "Another paragraph.", "A third."], + "blog": self.reading(), + }) + errs = self.check(root) + self.assertTrue(any("calibrationIntro" in e for e in errs), errs) + + def test_live_coverage_requires_a_catalog(self): + with tempfile.TemporaryDirectory() as root: + errs = [] + require_teaching_coverage(self.bank(), os.path.join(root, "teaching"), errs) + self.assertTrue( + any("data/teaching/amazon/index.json: missing" in e for e in errs), + errs) + + def test_live_coverage_requires_every_principle_file(self): + with tempfile.TemporaryDirectory() as root: + self.write(root, "index.json", { + "principles": [], + "blog": self.reading(), + }) + self.write(root, "customer-obsession.json", { + "id": 1001, + "slug": "customer-obsession", + "blog": self.reading(), + }) + errs = [] + require_teaching_coverage(self.bank(), os.path.join(root, "teaching"), errs) + self.assertTrue( + any("data/teaching/amazon/ownership.json: missing" in e for e in errs), + errs) + self.assertFalse( + any("customer-obsession.json: missing" in e for e in errs), + errs) + + def test_live_coverage_runs_when_the_teaching_root_is_absent(self): + with tempfile.TemporaryDirectory() as empty: + old = validate.DATA + validate.DATA = empty + try: + errs = [] + validate_teaching(self.bank(), errs) + finally: + validate.DATA = old + self.assertTrue(any("data/teaching: missing" in e for e in errs), errs) + self.assertTrue( + any("data/teaching/amazon/index.json: missing" in e for e in errs), + errs) + def test_a_blog_essay_url_is_rejected(self): with tempfile.TemporaryDirectory() as root: doc = self.good()