vault backup: 2026-05-15 16:58:51

This commit is contained in:
2026-05-15 16:58:51 -04:00
parent 901a23ae0e
commit b1b483daf8
38 changed files with 2562 additions and 75 deletions
+3 -1
View File
@@ -24,5 +24,7 @@
"pdf-plus", "pdf-plus",
"copy-document-as-html", "copy-document-as-html",
"templater-obsidian", "templater-obsidian",
"obsidian-toggle-list" "obsidian-toggle-list",
"neighbouring-files",
"cmdr"
] ]
+27 -10
View File
@@ -42,15 +42,6 @@
"key": "S" "key": "S"
} }
], ],
"obsidian-linter:lint-all-files": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "S"
}
],
"copy-as-html:copy-as-html-command": [ "copy-as-html:copy-as-html-command": [
{ {
"modifiers": [ "modifiers": [
@@ -93,5 +84,31 @@
], ],
"key": "X" "key": "X"
} }
] ],
"graph:open": [],
"graph:open-local": [
{
"modifiers": [
"Mod"
],
"key": "G"
}
],
"neighbouring-files:prev-alphabetical": [
{
"modifiers": [
"Mod"
],
"key": "K"
}
],
"neighbouring-files:next-alphabetical": [
{
"modifiers": [
"Mod"
],
"key": "J"
}
],
"editor:insert-link": []
} }
+51
View File
@@ -0,0 +1,51 @@
{
"confirmDeletion": false,
"showAddCommand": true,
"debug": false,
"editorMenu": [],
"fileMenu": [],
"leftRibbon": [],
"rightRibbon": [],
"titleBar": [],
"statusBar": [],
"pageHeader": [
{
"id": "neighbouring-files:prev-alphabetical",
"icon": "lucide-file-up",
"name": "Neighbouring Files: Navigate to prev file (alphabetical)",
"mode": "any"
},
{
"id": "neighbouring-files:next-alphabetical",
"icon": "lucide-file-down",
"name": "Neighbouring Files: Navigate to next file (alphabetical)",
"mode": "any"
}
],
"macros": [],
"explorer": [],
"hide": {
"statusbar": [
"properties",
"backlink"
],
"leftRibbon": [
"Digital Garden Publication Center",
"Open Git source control",
"New drawing",
"Advanced Tables Toolbar",
"Create new base"
]
},
"spacing": "8",
"advancedToolbar": {
"rowHeight": 48,
"rowCount": 1,
"spacing": 0,
"buttonWidth": 48,
"columnLayout": false,
"mappedIcons": [],
"tooltips": false,
"heightOffset": 0
}
}
+11
View File
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "cmdr",
"name": "Commander",
"version": "0.5.5",
"minAppVersion": "1.4.0",
"description": "Customize your workspace by adding commands everywhere, create Macros and supercharge your mobile toolbar.",
"author": "jsmorabito & phibr0",
"authorUrl": "https://github.com/phibr0",
"fundingUrl": "https://ko-fi.com/phibr0",
"isDesktopOnly": false
}
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
{
"defaultSortOrder": "alphabetical",
"enableFolderLoop": true,
"enableFolderBoundary": false,
"includedFileTypes": "markdownOnly",
"additionalExtensions": [
"canvas",
"pdf"
]
}
+450
View File
@@ -0,0 +1,450 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => NeighbouringFileNavigatorPlugin
});
module.exports = __toCommonJS(main_exports);
// src/NeighbouringFileNavigator.ts
var import_obsidian = require("obsidian");
var _NeighbouringFileNavigator = class _NeighbouringFileNavigator {
constructor(settings) {
this.settings = settings;
}
static reverse(fn) {
return (a, b) => -fn(a, b);
}
getFileExplorerSortOrder(workspace) {
var _a, _b, _c, _d, _e, _f;
return (_f = (_e = (_d = (_c = (_b = (_a = workspace.getLeavesOfType) == null ? void 0 : _a.call(workspace, "file-explorer")) == null ? void 0 : _b.first()) == null ? void 0 : _c.getViewState()) == null ? void 0 : _d.state) == null ? void 0 : _e.sortOrder) != null ? _f : this.settings.defaultSortOrder;
}
getCurrentSortFn(workspace) {
const sortOrder = this.getFileExplorerSortOrder(workspace);
return _NeighbouringFileNavigator.sorters[sortOrder];
}
navigateToNextFile(workspace) {
const sortOrder = this.getFileExplorerSortOrder(workspace);
console.debug("navigateToNextFile with sortOrder", sortOrder);
const sortFn = _NeighbouringFileNavigator.sorters[sortOrder];
this.navigateToNeighbouringFile(workspace, sortFn, true);
}
navigateToPrevFile(workspace) {
const sortOrder = this.getFileExplorerSortOrder(workspace);
console.debug("navigateToPrevFile with sortOrder", sortOrder);
const sortFn = _NeighbouringFileNavigator.sorters[sortOrder];
this.navigateToNeighbouringFile(workspace, sortFn, false);
}
navigateToNextAlphabeticalFile(workspace) {
console.debug("navigateToNextAlphabeticalFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.alphabetical,
true
);
}
navigateToPrevAlphabeticalFile(workspace) {
console.debug("navigateToPrevAlphabeticalFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.alphabetical,
false
);
}
navigateToOlderCreatedFile(workspace) {
console.debug("navigateToOlderCreatedFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.byCreatedTime,
true
);
}
navigateToNewerCreatedFile(workspace) {
console.debug("navigateToNewerCreatedFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.byCreatedTimeReverse,
true
);
}
navigateToOlderModifiedFile(workspace) {
console.debug("navigateToOlderModifiedFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.byModifiedTime,
true
);
}
navigateToNewerModifiedFile(workspace) {
console.debug("navigateToNewerModifiedFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.byModifiedTimeReverse,
true
);
}
navigateToResolvedFile(workspace, resolveTarget) {
const activeFile = workspace.getActiveFile();
if (!activeFile) return;
const toFile = resolveTarget(activeFile, this.getCurrentSortFn(workspace));
if (!toFile || toFile === activeFile) return;
workspace.getLeaf(false).openFile(toFile);
}
navigateToParentFolder(workspace) {
this.navigateToResolvedFile(workspace, (activeFile, sortFn) => {
var _a;
const parentFolder = (_a = activeFile.parent) == null ? void 0 : _a.parent;
return parentFolder ? this.findBoundaryFileInFolderTree(parentFolder, sortFn, true) : void 0;
});
}
navigateToFirstChildFolder(workspace) {
this.navigateToResolvedFile(
workspace,
(activeFile, sortFn) => this.findFileInChildFolders(activeFile.parent, sortFn)
);
}
navigateToNextSiblingFolder(workspace) {
this.navigateToResolvedFile(
workspace,
(activeFile, sortFn) => this.findFileInSiblingFolders(activeFile.parent, sortFn, true)
);
}
navigateToPrevSiblingFolder(workspace) {
this.navigateToResolvedFile(
workspace,
(activeFile, sortFn) => this.findFileInSiblingFolders(activeFile.parent, sortFn, false)
);
}
navigateToNeighbouringFile(workspace, sortFn, forward = true) {
const activeFile = workspace.getActiveFile();
if (!activeFile) return;
const files = this.getNeighbouringFiles(activeFile, sortFn);
if (!files.length) return;
const currentItem = files.findIndex(
(item) => item.name === activeFile.name
);
if (currentItem === -1) return;
const delta = forward ? 1 : -1;
const tentativeIndex = currentItem + delta;
const isAtBoundary = tentativeIndex < 0 || tentativeIndex >= files.length;
const nextIndex = this.settings.enableFolderLoop ? isAtBoundary ? forward ? 0 : files.length - 1 : tentativeIndex : Math.max(0, Math.min(tentativeIndex, files.length - 1));
let toFile = files[nextIndex];
const atFolderBoundary = !this.settings.enableFolderLoop && nextIndex === currentItem && isAtBoundary && (forward ? currentItem === files.length - 1 : currentItem === 0);
if (atFolderBoundary && this.settings.enableFolderBoundary) {
const boundaryFile = this.findBoundaryFile(
activeFile,
sortFn,
forward
);
if (boundaryFile) {
toFile = boundaryFile;
}
}
if (!toFile) return;
workspace.getLeaf(false).openFile(toFile);
}
filterFiletype(file) {
if (this.settings.includedFileTypes === "allFiles") return true;
if (this.settings.includedFileTypes === "markdownOnly") {
return file.extension === "md";
} else if (this.settings.includedFileTypes === "additionalExtensions") {
return file.extension === "md" || this.settings.additionalExtensions.includes(file.extension);
}
}
getNeighbouringFiles(file, sortFn) {
return file.parent ? this.getSortedFilesInFolder(file.parent, sortFn) : [];
}
getSortedFilesInFolder(folder, sortFn) {
var _a, _b;
return (_b = (_a = folder.children) == null ? void 0 : _a.filter((child) => child instanceof import_obsidian.TFile).filter((file) => this.filterFiletype(file)).sort(sortFn)) != null ? _b : [];
}
getChildFolders(folder) {
var _a, _b;
return (_b = (_a = folder.children) == null ? void 0 : _a.filter(
(child) => child instanceof import_obsidian.TFolder
)) != null ? _b : [];
}
findFileInChildFolders(folder, sortFn) {
if (!folder) return void 0;
for (const childFolder of this.getChildFolders(folder)) {
const toFile = this.findBoundaryFileInFolderTree(
childFolder,
sortFn,
true
);
if (toFile) return toFile;
}
return void 0;
}
findFileInSiblingFolders(currentFolder, sortFn, forward) {
if (!(currentFolder == null ? void 0 : currentFolder.parent)) return void 0;
const siblingFolders = this.getChildFolders(currentFolder.parent);
const currentFolderIndex = siblingFolders.findIndex(
(folder) => folder === currentFolder
);
if (currentFolderIndex === -1) return void 0;
const step = forward ? 1 : -1;
for (let folderIndex = currentFolderIndex + step; folderIndex >= 0 && folderIndex < siblingFolders.length; folderIndex += step) {
const toFile = this.findBoundaryFileInFolderTree(
siblingFolders[folderIndex],
sortFn,
forward
);
if (toFile) return toFile;
}
return void 0;
}
findBoundaryFileInFolderTree(folder, sortFn, forward) {
const sortedFiles = this.getSortedFilesInFolder(folder, sortFn);
const childFolders = this.getChildFolders(folder);
const orderedChildFolders = forward ? childFolders : childFolders.slice().reverse();
if (forward) {
if (sortedFiles.length) return sortedFiles[0];
for (const childFolder of orderedChildFolders) {
const file = this.findBoundaryFileInFolderTree(
childFolder,
sortFn,
forward
);
if (file) return file;
}
return void 0;
}
for (const childFolder of orderedChildFolders) {
const file = this.findBoundaryFileInFolderTree(
childFolder,
sortFn,
forward
);
if (file) return file;
}
return sortedFiles.length ? sortedFiles[sortedFiles.length - 1] : void 0;
}
findBoundaryFile(activeFile, sortFn, forward) {
let currentFolder = activeFile.parent;
if (!currentFolder) return void 0;
while (currentFolder && currentFolder.parent) {
const parentFolder = currentFolder.parent;
const boundaryFile = this.findFileInSiblingFolders(
currentFolder,
sortFn,
forward
);
if (boundaryFile) return boundaryFile;
const parentFiles = this.getSortedFilesInFolder(
parentFolder,
sortFn
);
if (parentFiles.length) {
return forward ? parentFiles[0] : parentFiles[parentFiles.length - 1];
}
currentFolder = parentFolder;
}
return void 0;
}
};
_NeighbouringFileNavigator.localeSorter = (a, b) => a.basename.localeCompare(b.basename, void 0, {
numeric: true,
sensitivity: "base"
});
_NeighbouringFileNavigator.mtimeSorter = (a, b) => {
return b.stat.mtime - a.stat.mtime;
};
_NeighbouringFileNavigator.ctimeSorter = (a, b) => {
return b.stat.ctime - a.stat.ctime;
};
_NeighbouringFileNavigator.sorters = {
alphabetical: _NeighbouringFileNavigator.localeSorter,
byCreatedTime: _NeighbouringFileNavigator.ctimeSorter,
byModifiedTime: _NeighbouringFileNavigator.mtimeSorter,
alphabeticalReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.localeSorter),
byCreatedTimeReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.ctimeSorter),
byModifiedTimeReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.mtimeSorter)
};
var NeighbouringFileNavigator = _NeighbouringFileNavigator;
// src/NeighbouringFileNavigatorPluginSettings.ts
var DEFAULT_SETTINGS = {
// sorting
defaultSortOrder: "alphabetical",
// navigation options
enableFolderLoop: false,
enableFolderBoundary: false,
// file mask
includedFileTypes: "markdownOnly",
additionalExtensions: ["canvas", "pdf"]
};
// src/NeighbouringFileNavigatorPluginSettingTab.ts
var import_obsidian2 = require("obsidian");
var NeighbouringFileNavigatorPluginSettingTab = class extends import_obsidian2.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
new import_obsidian2.Setting(containerEl).setName("Default Sort Order").setDesc("Fallback sort order used for the default command").addDropdown((dropdown) => {
dropdown.addOption("alphabetical", "Alphabetical");
dropdown.addOption("byCreatedTime", "Creation Timestamp");
dropdown.addOption("byModifiedTime", "Modification Timestamp");
dropdown.setValue(this.plugin.settings.defaultSortOrder);
dropdown.onChange(async (value) => {
this.plugin.settings.defaultSortOrder = value;
await this.plugin.saveSettings();
});
});
new import_obsidian2.Setting(containerEl).setName("Loop Notes in Folder").setDesc("Navigate to the first note when navigating past the last note in the same folder.").addToggle((toggle) => {
toggle.setValue(this.plugin.settings.enableFolderLoop);
toggle.onChange(async (value) => {
this.plugin.settings.enableFolderLoop = value;
await this.plugin.saveSettings();
});
});
new import_obsidian2.Setting(containerEl).setName("Continue Across Folders").setDesc("Move to adjacent folders when navigating beyond the current folder boundary.").addToggle((toggle) => {
toggle.setValue(this.plugin.settings.enableFolderBoundary);
toggle.onChange(async (value) => {
this.plugin.settings.enableFolderBoundary = value;
await this.plugin.saveSettings();
});
});
new import_obsidian2.Setting(containerEl).setName("Included File Types").setDesc("Set which file types to include in the navigation").addDropdown((dropdown) => {
dropdown.addOption("markdownOnly", "Markdown only");
dropdown.addOption("allFiles", "All files");
dropdown.addOption("additionalExtensions", "Additional file extensions below");
dropdown.setValue(this.plugin.settings.includedFileTypes);
dropdown.onChange(async (value) => {
this.plugin.settings.includedFileTypes = value;
await this.plugin.saveSettings();
this.display();
});
});
if (this.plugin.settings.includedFileTypes === "additionalExtensions") {
new import_obsidian2.Setting(containerEl).setName("Extensions").setDesc("List of additional file extensions to include in the navigation (comma separated)").addText((text) => {
text.setPlaceholder("canvas, pdf");
text.setValue(this.plugin.settings.additionalExtensions.join(", "));
text.onChange(async (value) => {
this.plugin.settings.additionalExtensions = value.split(",").map((ext) => ext.trim());
await this.plugin.saveSettings();
});
});
}
}
};
// src/main.ts
var import_obsidian3 = require("obsidian");
var NeighbouringFileNavigatorPlugin = class extends import_obsidian3.Plugin {
async onload() {
await this.loadSettings();
this.addSettingTab(
new NeighbouringFileNavigatorPluginSettingTab(this.app, this)
);
this.navigator = new NeighbouringFileNavigator(this.settings);
this.addCommand({
id: "next",
name: "Navigate to next file",
callback: () => this.navigator.navigateToNextFile(this.app.workspace)
});
this.addCommand({
id: "prev",
name: "Navigate to prev file",
callback: () => this.navigator.navigateToPrevFile(this.app.workspace)
});
this.addCommand({
id: "next-alphabetical",
name: "Navigate to next file (alphabetical)",
callback: () => this.navigator.navigateToNextAlphabeticalFile(
this.app.workspace
)
});
this.addCommand({
id: "prev-alphabetical",
name: "Navigate to prev file (alphabetical)",
callback: () => this.navigator.navigateToPrevAlphabeticalFile(
this.app.workspace
)
});
const olderCreated = {
name: "Navigate to older file (creation timestamp)",
callback: () => this.navigator.navigateToOlderCreatedFile(this.app.workspace)
};
this.addCommand({ ...olderCreated, id: "older-created" });
this.addCommand({ ...olderCreated, id: "prev-created" });
const newerCreated = {
name: "Navigate to newer file (creation timestamp)",
callback: () => this.navigator.navigateToNewerCreatedFile(this.app.workspace)
};
this.addCommand({ ...newerCreated, id: "next-created" });
this.addCommand({ ...newerCreated, id: "newer-created" });
const olderModified = {
name: "Navigate to older file (modification timestamp)",
callback: () => this.navigator.navigateToOlderModifiedFile(this.app.workspace)
};
this.addCommand({ ...olderModified, id: "older-modified" });
this.addCommand({ ...olderModified, id: "prev-modified" });
const newerModified = {
name: "Navigate to newer file (modification timestamp)",
callback: () => this.navigator.navigateToNewerModifiedFile(this.app.workspace)
};
this.addCommand({ ...newerModified, id: "next-modified" });
this.addCommand({ ...newerModified, id: "newer-modified" });
this.addCommand({
id: "folder-up",
name: "Folder up",
callback: () => this.navigator.navigateToParentFolder(this.app.workspace)
});
this.addCommand({
id: "folder-down",
name: "Folder down",
callback: () => this.navigator.navigateToFirstChildFolder(this.app.workspace)
});
this.addCommand({
id: "folder-next",
name: "Next folder",
callback: () => this.navigator.navigateToNextSiblingFolder(this.app.workspace)
});
this.addCommand({
id: "folder-prev",
name: "Prev folder",
callback: () => this.navigator.navigateToPrevSiblingFolder(this.app.workspace)
});
}
onunload() {
}
async loadSettings() {
this.settings = Object.assign(
{},
DEFAULT_SETTINGS,
await this.loadData()
);
}
async saveSettings() {
await this.saveData(this.settings);
}
};
/* nosourcemap */
+11
View File
@@ -0,0 +1,11 @@
{
"id": "neighbouring-files",
"name": "Neighbouring Files",
"version": "1.1.3",
"minAppVersion": "0.15.0",
"description": "Navigate to the next and previous file in the current directory",
"author": "Fabian Untermoser",
"authorUrl": "https://www.ederbit.xyz",
"fundingUrl": "https://www.ederbit.xyz/coffee",
"isDesktopOnly": false
}
+1847
View File
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "sheets",
"name": "Sheets Extended",
"version": "1.2.10",
"minAppVersion": "1.5.0",
"description": "Vertical headers, merged cells, and custom css tables with advanced table compatibility",
"author": "NicoNekoru",
"authorUrl": "https://github.com/NicoNekoru",
"fundingUrl": "https://www.buymeacoffee.com/niconekoru",
"isDesktopOnly": false
}
+35
View File
@@ -0,0 +1,35 @@
/*
This CSS file will be included with your plugin, and
available in the app when your plugin is enabled.
If your plugin does not need CSS, delete this file.
*/
.obs-sheets_error {
color: rgb(255, 100, 100);
background-color: rgba(240, 128, 128, 20%);
text-rendering: optimizeLegibility;
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
color-scheme: dark;
-webkit-user-select: text;
white-space: break-spaces;
word-break: break-word;
overflow-wrap: anywhere;
-webkit-user-modify: read-write-plaintext-only;
tab-size: 4;
box-sizing: border-box;
font-size: var(--code-size);
font-family: var(--font-monospace);
clear: left;
left: 0;
right: 0;
margin: 0 !important;
display: block;
position: relative;
padding: 0;
max-width: var(--file-line-width);
padding-left: var(--size-4-4);
text-align: center;
}
+9 -1
View File
@@ -5,11 +5,19 @@ up: "[[conest]]"
--- ---
# Takeoff Scripts # Takeoff Scripts
I often refer to "ConEst takeoff scripts"
as justification for certain of decisions,
but like the Project Management Body of Knowledge,
they do not really exist in writing.
Scripts should be directed, Scripts should be directed,
limiting extraneous information. limiting extraneous information.
## Citations ## Citations
For the purpose of accountability,
it is crucial that all direction have a documented origin.
Use footnotes to reference timestamped notes. Use footnotes to reference timestamped notes.
Do this: Do this:
@@ -29,4 +37,4 @@ not this:
> Even when drawings show 2 separate duplex receptacles, > Even when drawings show 2 separate duplex receptacles,
> use `DW & DISPOSAL DUAL CIR - ...`, > use `DW & DISPOSAL DUAL CIR - ...`,
> which includes only one receptacle. > which includes only one receptacle.
``` ```
-8
View File
@@ -21,16 +21,8 @@ variance of actual cost/hours versus estimated,
(obviously) requires estimates, (obviously) requires estimates,
which are subject to bias and error. which are subject to bias and error.
If you argue that subject matter expert estimates _are_ objective If you argue that subject matter expert estimates _are_ objective
<<<<<<< HEAD
under a Bayesian interpretation, under a Bayesian interpretation,
then sure, but then EVM is not unique. then sure, but then EVM is not unique.
EVM WBS's, as a form of [[estimate-decomposition]], EVM WBS's, as a form of [[estimate-decomposition]],
suffer from its weakness of compounding inaccuracy. suffer from its weakness of compounding inaccuracy.
=======
under the Bayesian interpretation,
then sure, but then EVM is not unique.
EVM as a form of [[estimate-decomposition]]
suffers f
>>>>>>> origin/main
+3 -3
View File
@@ -2,10 +2,10 @@
id: 2026-03-02T15:35:49-0500 id: 2026-03-02T15:35:49-0500
title: 2026-03-02 15:35:49 title: 2026-03-02 15:35:49
tags: tags:
- status/draft
- occupational - occupational
date-created: 2026-03-02T15:35:49-05:00 - status/draft
daily: "[[2026-03-02]]" daily: "[[2026-03-02]]"
date-created: 2026-03-02T15:35:49-05:00
--- ---
# 2026-03-02 15:35:49 # 2026-03-02 15:35:49
@@ -14,4 +14,4 @@ daily: "[[2026-03-02]]"
Change order for awarded project [[belle-meade-plaza|Belle Meade Plaza]] Change order for awarded project [[belle-meade-plaza|Belle Meade Plaza]]
Distribution Panel "DPCT2" was deleted, Distribution Panel "DPCT2" was deleted,
orphaned loads to be served from "DPCT" (previously "DPCT1") orphaned loads to be served from "DPCT" (previously "DPCT1")
+2 -1
View File
@@ -207,7 +207,8 @@ and completes each systems accurately (FA/DAS/2Way).
Zane references Electrical and Low Voltage drawings Zane references Electrical and Low Voltage drawings
to determine job requirements for accurate take-off of the Telecom system. to determine job requirements for accurate take-off of the Telecom system.
Telecom seems to be a living system that changes between initial take-off to completion, Telecom seems to be a living system
that changes between initial take-off to completion,
and Zane does a good job to stay on top of it. and Zane does a good job to stay on top of it.
Can improve speed of take-off Can improve speed of take-off
+1 -1
View File
@@ -28,7 +28,7 @@ with clarification by [[joel-jansen]]:
> in dry locations only. > in dry locations only.
> [!quote] Joel Jansen 2026-03-10 (pp.) > [!quote] Joel Jansen 2026-03-10 (pp.)
> Takeoff as specified > Take off as specified
### Liquid-Tight Conduit ### Liquid-Tight Conduit
+2 -1
View File
@@ -21,7 +21,8 @@ with a search algorithm like [A*](https://en.wikipedia.org/wiki/A*_search_algori
Such a program could also calculate voltage drop. Such a program could also calculate voltage drop.
I think, though, I may have been unfair to my employers (current and previous). I think, though, I may have been unfair to my employers (current and previous).
Innovative methods will always be bottlenecked by [[accubid|Accubid]]'s strict input pattern, Innovative methods will always be bottlenecked
by [[accubid|Accubid]]'s strict input pattern,
but there are still opportunities for improvement but there are still opportunities for improvement
that can comply with existing expectations of evidence. that can comply with existing expectations of evidence.
+4 -1
View File
@@ -26,8 +26,11 @@ be used to track
Intent is too provide information to the bid team Intent is too provide information to the bid team
potentially to be qualified in future bids. potentially to be qualified in future bids.
> 1. ConEst deviates from specs based on direction from [[pdi-bid-estimating|Bid]]. > 1. ConEst deviates from specs
> based on direction from [[pdi-bid-estimating|Bid]].
>
> 2. Awarded contract does not include respect for the direction > 2. Awarded contract does not include respect for the direction
>
> 3. Ops, not aware of direction, believes ConEst takeoff was in error. > 3. Ops, not aware of direction, believes ConEst takeoff was in error.
Intent is to improve transparency, Intent is to improve transparency,
+11 -5
View File
@@ -19,9 +19,11 @@ Follow-up to [[2026-03-19_09-00-43]]
> Following up from our meeting yesterday. > Following up from our meeting yesterday.
> Please see attached for the Pre-takeoff template and example. > Please see attached for the Pre-takeoff template and example.
> >
> * The template is saved here: S:\Estimating\7 ConEst Team\ConEst Process Documents > * The template is saved here:
> S:\Estimating\7 ConEst Team\ConEst Process Documents
> >
> * When completed please save in #4. Notes & E-mails within the project folder. > * When completed please save in
> #4. Notes & E-mails within the project folder.
> >
> * When distribution to the team, > * When distribution to the team,
> please send content within the body of the email > please send content within the body of the email
@@ -30,10 +32,14 @@ Follow-up to [[2026-03-19_09-00-43]]
> * Distribution List: > * Distribution List:
> >
> * To: PCM, Senior Estimator & Estimator > * To: PCM, Senior Estimator & Estimator
> * CC: Senior Construction Estimator, Other ConEst team members on the project, Josh Ford, Corwin Fluit & Jessalyn Williams > * CC: Senior Construction Estimator,
> Other ConEst team members on the project,
> Josh Ford, Corwin Fluit & Jessalyn Williams
> >
> * We will not use this exact template for Design Builds (remove spec portion of email), > * We will not use this exact template for Design Builds
> Data Centers, Stadiums or Large commercial projects (We will customize based on SOW) > (remove spec portion of email),
> Data Centers, Stadiums or Large commercial projects
> (We will customize based on SOW)
> >
> For the tasks, I will set up a separate meeting to go over that portion, > For the tasks, I will set up a separate meeting to go over that portion,
> feel free to leave that portion off the email until after that training. > feel free to leave that portion off the email until after that training.
+7 -6
View File
@@ -9,20 +9,21 @@ daily: "[[2026-03-23]]"
--- ---
# 2026-03-23 12:48:49 # 2026-03-23 12:48:49
[[joel-jansen]] asked me to give feedback on the project engineer [[joel-jansen]] asked me to give feedback on Christopher Glass,
I've had shadowing and helping me on [[charlotte-south-end-hotel]]. the project engineer I've had shadowing me
and helping on [[charlotte-south-end-hotel]].
They've been exceptionally engaged, He's been exceptionally engaged,
with an impressive ability to follow along with procedures with an impressive ability to follow along with procedures
that are based in electrical and general construction considerations that are based in electrical and general construction considerations
that they weren't already familiar with. that he wasn't already familiar with.
I told Joel the same. I told Joel the same.
I added that I appreciated that their engagement extends I added that I appreciated that his engagement extends
to my explanations of my thought processes during takeoff, to my explanations of my thought processes during takeoff,
which can be quite abstract. which can be quite abstract.
I found the PE's receptivity I found Chris's receptivity
a pleasant surprise. a pleasant surprise.
In my experience training estimating, In my experience training estimating,
both at Ace and PDI, both at Ace and PDI,
+4 -4
View File
@@ -20,14 +20,14 @@ Intent is to reduce WBS turnaround,
reduce time spent sitting on WBS's completed reduce time spent sitting on WBS's completed
except for pending tasks. except for pending tasks.
A task is "missing" A task is "missing" if
if it is necessary to complete the WBS 1. it is necessary to complete the WBS
and it is not already open (or completed) in BPM. 2. it is not already open (or completed) in BPM.
* **BPM > Bid History:** Tasks within the current Bid Round * **BPM > Bid History:** Tasks within the current Bid Round
* **BPM > Tasks:** Tasks outside of Bid Round * **BPM > Tasks:** Tasks outside of Bid Round
Tasks > 1. Open Tasks Tasks > 1. Open Tasks \
Tasks > 2. Completed Tasks Tasks > 2. Completed Tasks
* Constructability Review * Constructability Review
+6 -4
View File
@@ -12,7 +12,7 @@ daily: "[[2026-03-26]]"
## 1990 K Street: ConEst Manager Review ## 1990 K Street: ConEst Manager Review
[[conest-manager-review]] for [[1990-k-street]] [[conest-manager-review]] for [[1990-k-street]]
lead by Josh Ford and [[joel-jansen]] lead by [[josh-ford|Josh Ford]] and [[joel-jansen|Joel Jansen]]
### Purpose of ConEst Manager Review ### Purpose of ConEst Manager Review
@@ -53,12 +53,14 @@ to be confirmed with [[christian-pereiro]].
### EV Chargers ### EV Chargers
EV Chargers were erroneously placed in `System` "EL - Electrical". > [!failure]
> EV Chargers were erroneously placed in `System` "EL - Electrical".
### Lighting Controls ### Lighting Controls
Josh was looking for for energy code > [!failure]
not present in pre-takeoff email or OneNote. > Josh was looking for for energy code
> not present in pre-takeoff email or OneNote.
ASHRAE 2016 ASHRAE 2016
+8 -3
View File
@@ -18,6 +18,9 @@ attended by [[joel-jansen]] and myself.
"MSA TO BUSDUCT" "MSA TO BUSDUCT"
needs more elbows: added. needs more elbows: added.
***
Josh talked about necessary pullboxes, Josh talked about necessary pullboxes,
but they were not added. but they were not added.
Josh stated the purpose of the closeout budget Josh stated the purpose of the closeout budget
@@ -25,6 +28,8 @@ is to prevent procurement from buying sizes
that may be chosen arbitrarily. that may be chosen arbitrarily.
Added $5,000 to the budget. Added $5,000 to the budget.
***
Concern was expressed Concern was expressed
that feeders up from Main Elec may need to be lengthened that feeders up from Main Elec may need to be lengthened
to follow MSA TO BUSDUCT routing shown on floor plans. to follow MSA TO BUSDUCT routing shown on floor plans.
@@ -53,13 +58,13 @@ Josh complemented subfeed routing:
"That's taking pride in your work." "That's taking pride in your work."
I have had hesitation that it was worth doing, I have had hesitation that it was worth doing,
if someone told be it was a waste of time, if someone told me it was a waste of time,
I would not have been inclined to disagree. I would not have been inclined to disagree.
#### Units #### Units
Unit receptacles are shown controlled by master switch system. Unit receptacles are shown controlled by master switch system.
I assumed full control (not half) so no made no consideration in takeoff. I assumed full control (not half) so made no consideration in takeoff.
Approved. Approved.
#### Lighting Control #### Lighting Control
@@ -79,7 +84,7 @@ DO NOT USE `System` "LV - Lighting Controls System" EVER
> [!quote] Josh Ford > [!quote] Josh Ford
> We're carrying material handling > We're carrying material handling
> because we own fixtures and its a tall building > because we own fixtures and it's a tall building
#### Labor Plan #### Labor Plan
+6 -4
View File
@@ -22,9 +22,11 @@ I would not be surprised to hear of an estimator responding this way
even after Hubbard's calibration. even after Hubbard's calibration.
Hubbard repeatedly conflates estimates of uncertain events Hubbard repeatedly conflates estimates of uncertain events
with personal estimates of trivia questions with certain answers. with personal estimates of trivia questions with certain answers.
These are functionally identical, Under Bayesian statistics these cases are identical,
but _feel_ very different. but they still _feel_ very different.
Hubbard could do better to address this bias. Hubbard could do better to address this bias.
If you don't know the answer offhand, If you don't know the answer offhand, imagine it has been lost to time.
imagine it has been lost to time. According to most discographers,
The Winstons' _Color Him Father_ (the origin of the Amen break)
was released "May 1969", with no date.
+10 -3
View File
@@ -8,11 +8,18 @@ date-created: 2026-04-08T13:53:59-04:00
--- ---
# 2026-04-08 13:53:59 # 2026-04-08 13:53:59
> [!quote] [[hubbard_2025_project-management#Conflating Uncertainty with Knowing Nothing]] (text decoration added) > [!quote] Hubbard et al[^1]
> An assumption is a statement we treat as true for the sake of argument, regardless of whether it is true. > An assumption is a statement
> Assumptions are necessary if you have to use deterministic accounting methods with exact points as values. > we treat as true for the sake of argument,
> regardless of whether it is true.
> Assumptions are necessary
> if you have to use deterministic accounting methods
> with exact points as values.
> ==You rarely, if ever, know an exact point with certainty,== > ==You rarely, if ever, know an exact point with certainty,==
> ==so any such value must be an assumption.== > ==so any such value must be an assumption.==
[^1]: [[hubbard_2025_project-management#Conflating Uncertainty with Knowing Nothing]]
(text decoration added)
Assumptions are frowned upon in [[construction-estimating]], Assumptions are frowned upon in [[construction-estimating]],
but they are only made necessary by the insistence on exact values. but they are only made necessary by the insistence on exact values.
+1 -1
View File
@@ -18,7 +18,7 @@ Data grabbed from The Hub last year before I lost access
has both sale price and cost at exactly $19,906,645.23. has both sale price and cost at exactly $19,906,645.23.
> [!aside] > [!aside]
> Obviously this is doctored, > Obviously this is phony,
> which is immensely frustrating, > which is immensely frustrating,
> but irrelevant to this note. > but irrelevant to this note.
+3 -3
View File
@@ -30,9 +30,9 @@ and with that I feel my understanding has doubled.
At 5,976,038 sqft per BPM At 5,976,038 sqft per BPM
that comes out to almost exactly $0.04 per sqft. that comes out to almost exactly $0.04 per sqft.
If ConEst is budgeted per square foot ConEst is budgeted per square foot
then it should follow that ConEst effort which suggests that total ConEst effort
should be proportional to building area, is expected to be proportional to building area,
but this is not usually the case in practice. but this is not usually the case in practice.
Since larger jobs tend to have more typical work, Since larger jobs tend to have more typical work,
jobs of every size tend to take about two weeks jobs of every size tend to take about two weeks
+2 -2
View File
@@ -21,8 +21,8 @@ but when there was still vocal opposition
to its adoption as such. to its adoption as such.
In elementary school I was taught how to use the library traditionally In elementary school I was taught how to use the library traditionally
and I heard every week that on Wikipedia and I heard every week
erroneous content is presented as fact. that on Wikipedia erroneous content is presented as fact.
At the time I took issue with the warning, At the time I took issue with the warning,
now I recognize it as implicit [[nirvana-fallacy]]. now I recognize it as implicit [[nirvana-fallacy]].
Print encyclopedias have the same problem Print encyclopedias have the same problem
+3 -3
View File
@@ -44,9 +44,9 @@ Just a decade after the Rolodex was killed,
but already two from today. but already two from today.
In another another three In another another three
my kid will say the same. my kid will say the same:
Just a decade after the Rolodex was killed, "Just a decade after the Rolodex was killed,
but already five from today. but already five from today."
Chips get faster, Chips get faster,
apps get slower. apps get slower.
+3 -2
View File
@@ -8,11 +8,12 @@ daily: "[[2026-04-12]]"
--- ---
# 2026-04-12 02:23:28 # 2026-04-12 02:23:28
Speaking to a mechanical engineer formerly employed by PDI Speaking to a mechanical engineer
formerly employed by [[power-design-inc|PDI]]
I asked if they had any examples of PDI-specific practice I asked if they had any examples of PDI-specific practice
that they had been lead to believe was industry standard. that they had been lead to believe was industry standard.
They said that the drafting that they were expected to perform They said that the drafting that they were expected to perform
was at an unhappy middle ground of detail was at an unhappy middle ground of granularity
between the practice they were taught in school between the practice they were taught in school
would be appropriate for their skill would be appropriate for their skill
and that which they associated with operations. and that which they associated with operations.
+1 -1
View File
@@ -22,7 +22,7 @@ because one can not think as deeply while standing as while sitting.[^1]
I think the largest part of my tendency I think the largest part of my tendency
is that I don't like people watching me work. is that I don't like people watching me work.
He clarified that he did this in order to _focus_, He clarified that he did this _in order to focus_,
which I have heard before but never gave much credit. which I have heard before but never gave much credit.
I then made the now obvious connection I then made the now obvious connection
that impairing deep thinking is exactly the method that impairing deep thinking is exactly the method
+1 -1
View File
@@ -35,7 +35,7 @@ to prevent the most pain from future mistakes.
*** ***
Rationale is the most important part of the entry. Rationale is the most important part of the entry.
It's not helpful to say It's not helpful to say "I just wasn't thinking".
If that's truly what seems to be the cause, If that's truly what seems to be the cause,
consider your state at the time: consider your state at the time:
Were you mentally exhausted? Were you mentally exhausted?
+1 -1
View File
@@ -8,7 +8,7 @@ daily: "[[2026-04-15]]"
--- ---
# 2026-04-15 17:31:57 # 2026-04-15 17:31:57
A peer, not intending to, [[william-bonn|Willie]], not intending to,
convinced me I should buy my next car convinced me I should buy my next car
as much over email as possible. as much over email as possible.
+2 -1
View File
@@ -13,7 +13,8 @@ daily: "[[2026-04-15]]"
The [Gell-Mann amnesia effect](https://en.wikipedia.org/wiki/Michael_Crichton#%22Gell-Mann_amnesia_effect%22) The [Gell-Mann amnesia effect](https://en.wikipedia.org/wiki/Michael_Crichton#%22Gell-Mann_amnesia_effect%22)
may explain my tendency to rave about literature on other disciplines. may explain my tendency to rave about literature on other disciplines.
I am a bitter detractor of Mike Holt, I am a bitter detractor of Mike Holt,
(who may be the only thing approaching a published researcher in our shared fields[^1]) (who may be the only thing approaching a published researcher
in our shared fields[^1])
but I'm quick to ignore typos and other presentation issues but I'm quick to ignore typos and other presentation issues
which may be indicative of low rigor which may be indicative of low rigor
in books and articles for adjacent fields. in books and articles for adjacent fields.
+2 -1
View File
@@ -9,7 +9,8 @@ daily: "[[2026-04-29]]"
## Soldiering ## Soldiering
[**Soldiering**](https://en.wikipedia.org/wiki/Scientific_management#Soldiering) [**Soldiering**](https://en.wikipedia.org/wiki/Scientific_management#Soldiering)
describes the practice of performing the bare minimum necessary to avoid punishment. describes the practice of workers
performing to the bare minimum necessary to avoid punishment.
Coined in [[taylor_1911_scientific-management]], Coined in [[taylor_1911_scientific-management]],
though Taylor acknowledged the tendency was given many names. though Taylor acknowledged the tendency was given many names.
+2 -1
View File
@@ -27,7 +27,8 @@ Evidence for the theory seems to come down to two points:
* **Zampanò is personally invested in _The Navidson Record_.** * **Zampanò is personally invested in _The Navidson Record_.**
It is widely understood that _House of Leaves_ It is widely understood that _House of Leaves_
(by Zampanò, not the fictional book Navy reads in the _Record_) (by Zampanò, not by Danielewski,
also not the fictional book Navy reads in the _Record_)
is allegorical for Zampanò's blindness. is allegorical for Zampanò's blindness.
At times, Zampanò refers to Navy in the first person. At times, Zampanò refers to Navy in the first person.
These do not prove he invented the narrative, These do not prove he invented the narrative,
-2
View File
@@ -15,8 +15,6 @@ received while working on [[hilltop-gardens|Hilltop Gardens]].
Relevant to [[two-way-takeoff]]: Relevant to [[two-way-takeoff]]:
> [!quote] Ben O'Brien's OneNote: Takeoff/(FA RISER + 2-WAY) > [!quote] Ben O'Brien's OneNote: Takeoff/(FA RISER + 2-WAY)
> * Horizontal: > * Horizontal:
> * Length: > * Length: