From ca41ea35673e6d034e036e423e7e0d366a5c97f7 Mon Sep 17 00:00:00 2001 From: rand Date: Sat, 26 Sep 2026 00:52:31 -0400 Subject: [PATCH] feat: Assignment 1; initialization --- .gitignore | 9 + IEEEtran.bst | 2365 +++++++++++++++++++++++++++++++++++ abstract.tex | 7 + cornell.cls | 367 ++++++ devopsAIAgentGuide.tex | 107 ++ devopsAIPromptLog.tex | 49 + devopsAssignment.tex | 126 ++ devopsDocumentGuide.tex | 142 +++ devopsDocumentHistory.tex | 15 + devopsExampleAssignment.tex | 126 ++ devopsGlossary.tex | 12 + devopsHosts.tex | 83 ++ devopsIntroduction.tex | 69 + devopsKanbanSetup.tex | 95 ++ devopsPasswords.tex | 70 ++ devopsReferences.bib | 6 + kanbanboard.png | Bin 0 -> 110356 bytes prologue.tex | 25 + 18 files changed, 3673 insertions(+) create mode 100644 .gitignore create mode 100644 IEEEtran.bst create mode 100644 abstract.tex create mode 100644 cornell.cls create mode 100644 devopsAIAgentGuide.tex create mode 100644 devopsAIPromptLog.tex create mode 100644 devopsAssignment.tex create mode 100644 devopsDocumentGuide.tex create mode 100644 devopsDocumentHistory.tex create mode 100644 devopsExampleAssignment.tex create mode 100644 devopsGlossary.tex create mode 100644 devopsHosts.tex create mode 100644 devopsIntroduction.tex create mode 100644 devopsKanbanSetup.tex create mode 100644 devopsPasswords.tex create mode 100644 devopsReferences.bib create mode 100644 kanbanboard.png create mode 100644 prologue.tex diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5906a4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.aux +*.log +*.out +*.toc +*.bbl +*.blg +*.synctex.gz +*.fls +*.fdb_latexmk \ No newline at end of file diff --git a/IEEEtran.bst b/IEEEtran.bst new file mode 100644 index 0000000..b9c3b93 --- /dev/null +++ b/IEEEtran.bst @@ -0,0 +1,2365 @@ +%% +%% IEEEtran.bst +%% BibTeX Bibliography Style file for IEEE Journals and Conferences (unsorted) +%% Version 1.10 (2002/09/27) +%% +%% Copyright (c) 2002 Michael Shell +%% +%% Original starting code base and algorithms obtained from the output of +%% Patrick W. Daly's makebst package as well as from prior versions of +%% IEEE BibTeX styles: +%% +%% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988) +%% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993) +%% +%% +%% See: +%% http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/ +%% for latest version and current contact information. +%% +%% For use with BibTeX version 0.99a or later +%% +%% This is a numerical citation style. +%% +%%********************************************************************** +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall IEEE or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% This code is distributed under the Perl Artistic License +%% ( http://language.perl.com/misc/Artistic.html ) +%% and may be freely used, distributed and modified - subject to the +%% constraints therein. +%% Retain all contribution notices, credits and disclaimers. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE. +%%********************************************************************** +% +% +% Changelog: +% +% 1.00 (2002/08/13) Initial release +% +% 1.10 (2002/09/27) +% 1. Corrected minor bug for improperly formed warning message when a +% book was not given a title. Thanks to Ming Kin Lai for reporting this. +% 2. Added support for CTLname_format_string and CTLname_latex_cmd fields +% in the BST control entry type. + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% These are the defaults for the user adjustable controls. The values used +% here can be overridden by the user via IEEEtranBSTCTL entry type. + +% NOTE: The recommended LaTeX command to invoke a control entry type is: +% +%\makeatletter +%\def\bstctlcite#1{\@bsphack +% \@for\@citeb:=#1\do{% +% \edef\@citeb{\expandafter\@firstofone\@citeb}% +% \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi}% +% \@esphack} +%\makeatother +% +% It is called at the start of the document, before the first \cite, like: +% \bstctlcite{IEEEexample:BSTcontrol} +% +% IEEEtran.cls V1.6 and later does provide this command. + + + +% #0 turns off the display of the number for articles. +% #1 enables +FUNCTION {default.is.use.number.for.article} { #1 } + + +% #0 turns off the display of the paper and type fields in @inproceedings. +% #1 enables +FUNCTION {default.is.use.paper} { #1 } + + +% #0 turns off the forced use of "et al." +% #1 enables +FUNCTION {default.is.forced.et.al} { #0 } + +% The maximum number of names that can be present beyond which an "et al." +% usage is forced. Be sure that num.names.shown.with.forced.et.al (below) +% is not greater than this value! +% Note: There are many instances of references in IEEE journals which have +% a very large number of authors as well as instances in which "et al." is +% used profusely. +FUNCTION {default.max.num.names.before.forced.et.al} { #10 } + +% The number of names that will be shown with a forced "et al.". +% Must be less than or equal to max.num.names.before.forced.et.al +FUNCTION {default.num.names.shown.with.forced.et.al} { #1 } + + +% #0 turns off the alternate interword spacing for entries with URLs. +% #1 enables +FUNCTION {default.is.use.alt.interword.spacing} { #1 } + +% If alternate interword spacing for entries with URLs is enabled, this is +% the interword spacing stretch factor that will be used. For example, the +% default "4" here means that the interword spacing in entries with URLs can +% stretch to four times normal. Does not have to be an integer. Note that +% the value specified here can be overridden by the user in their LaTeX +% code via a command such as: +% "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to +% that via the IEEEtranBSTCTL entry type. +FUNCTION {default.ALTinterwordstretchfactor} { "4" } + + +% #0 turns off the "dashification" of repeated (i.e., identical to those +% of the previous entry) names. IEEE normally does this. +% #1 enables +FUNCTION {default.is.dash.repeated.names} { #1 } + + +% The default name format control string. +FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" } + + +% The default LaTeX font command for the names. +FUNCTION {default.name.latex.cmd}{ "" } + + +% Other controls that cannot be accessed via IEEEtranBSTCTL entry type. + +% #0 turns off the terminal startup banner/completed message so as to +% operate more quietly. +% #1 enables +FUNCTION {is.print.banners.to.terminal} { #1 } + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% FILE VERSION AND BANNER %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION{bst.file.version} { "1.10" } +FUNCTION{bst.file.date} { "2002/09/27" } +FUNCTION{bst.file.website} { "http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/" } + +FUNCTION {banner.message} +{ is.print.banners.to.terminal + { "-- IEEEtran.bst version" " " * bst.file.version * + " (" * bst.file.date * ") " * "by Michael Shell." * + top$ + "-- " bst.file.website * + top$ + "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * " manual for usage information." * + top$ + } + { skip$ } + if$ +} + +FUNCTION {completed.message} +{ is.print.banners.to.terminal + { "" + top$ + "Done." + top$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING CONSTANTS %% +%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {bbl.and}{ "and" } +FUNCTION {bbl.etal}{ "et~al." } +FUNCTION {bbl.editors}{ "eds." } +FUNCTION {bbl.editor}{ "ed." } +FUNCTION {bbl.edition}{ "ed." } +FUNCTION {bbl.volume}{ "vol." } +FUNCTION {bbl.of}{ "of" } +FUNCTION {bbl.number}{ "no." } +FUNCTION {bbl.in}{ "in" } +FUNCTION {bbl.pages}{ "pp." } +FUNCTION {bbl.page}{ "p." } +FUNCTION {bbl.chapter}{ "ch." } +FUNCTION {bbl.paper}{ "paper" } +FUNCTION {bbl.part}{ "pt." } +FUNCTION {bbl.patent}{ "Patent" } +FUNCTION {bbl.patentUS}{ "U.S." } +FUNCTION {bbl.revision}{ "Rev." } +FUNCTION {bbl.series}{ "ser." } +FUNCTION {bbl.standard}{ "Std." } +FUNCTION {bbl.techrep}{ "Tech. Rep." } +FUNCTION {bbl.mthesis}{ "Master's thesis" } +FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" } +FUNCTION {bbl.urlprefix}{ "[Online]. Available:" } +FUNCTION {bbl.st}{ "st" } +FUNCTION {bbl.nd}{ "nd" } +FUNCTION {bbl.rd}{ "rd" } +FUNCTION {bbl.th}{ "th" } + + +% This is the LaTeX spacer that is used when a larger than normal space +% is called for (such as just before the address:publisher). +FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " } + +% The LaTeX code for dashes that are used to represent repeated names. +% Note: Some older IEEE journals used something like +% "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along +% the baseline. However, IEEE now uses a thinner, above baseline, +% six dash long sequence. +FUNCTION {repeated.name.dashes} { "------" } + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PREDEFINED STRING MACROS %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MACRO {jan} {"Jan."} +MACRO {feb} {"Feb."} +MACRO {mar} {"Mar."} +MACRO {apr} {"Apr."} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"Aug."} +MACRO {sep} {"Sept."} +MACRO {oct} {"Oct."} +MACRO {nov} {"Nov."} +MACRO {dec} {"Dec."} + + + +%%%%%%%%%%%%%%%%%% +%% ENTRY FIELDS %% +%%%%%%%%%%%%%%%%%% + +ENTRY + { address + assignee + author + booktitle + chapter + day + dayfiled + edition + editor + howpublished + institution + intype + journal + key + language + month + monthfiled + nationality + note + number + organization + pages + paper + publisher + school + series + revision + title + type + url + volume + year + yearfiled + CTLuse_article_number + CTLuse_paper + CTLuse_forced_etal + CTLmax_names_forced_etal + CTLnames_show_etal + CTLuse_alt_spacing + CTLalt_stretch_factor + CTLdash_repeated_names + CTLname_format_string + CTLname_latex_cmd + } + {} + { label } + + + + +%%%%%%%%%%%%%%%%%%%%%%% +%% INTEGER VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%%% + +INTEGERS { prev.status.punct this.status.punct punct.std + punct.no punct.comma punct.period + prev.status.space this.status.space space.std + space.no space.normal space.large + prev.status.quote this.status.quote quote.std + quote.no quote.close + prev.status.nline this.status.nline nline.std + nline.no nline.newblock + status.cap cap.std + cap.no cap.yes} + +INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames } + +INTEGERS { is.use.number.for.article + is.use.paper + is.forced.et.al + max.num.names.before.forced.et.al + num.names.shown.with.forced.et.al + is.use.alt.interword.spacing + is.dash.repeated.names} + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%% + +STRINGS { bibinfo + longest.label + oldname + s + t + ALTinterwordstretchfactor + name.format.string + name.latex.cmd} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOW LEVEL FUNCTIONS %% +%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.controls} +{ default.is.use.number.for.article 'is.use.number.for.article := + default.is.use.paper 'is.use.paper := + default.is.forced.et.al 'is.forced.et.al := + default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al := + default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al := + default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing := + default.is.dash.repeated.names 'is.dash.repeated.names := + default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor := + default.name.format.string 'name.format.string := + default.name.latex.cmd 'name.latex.cmd := +} + + +% This IEEEtran.bst features a very powerful and flexible mechanism for +% controlling the capitalization, punctuation, spacing, quotation, and +% newlines of the formatted entry fields. (Note: IEEEtran.bst does not need +% or use the newline/newblock feature, but it has been implemented for +% possible future use.) The output states of IEEEtran.bst consist of +% multiple independent attributes and, as such, can be thought of as being +% vectors, rather than the simple scalar values ("before.all", +% "mid.sentence", etc.) used in most other .bst files. +% +% The more flexible and complex design used here was motivated in part by +% IEEE's rather unusual bibliography style. For example, IEEE ends the +% previous field item with a period and large space prior to the publisher +% address; the @electronic entry types use periods as inter-item punctuation +% rather than the commas used by the other entry types; and URLs are never +% followed by periods even though they are the last item in the entry. +% Although it is possible to accommodate these features with the conventional +% output state system, the seemingly endless exceptions make for convoluted, +% unreliable and difficult to maintain code. +% +% IEEEtran.bst's output state system can be easily understood via a simple +% illustration of two most recently formatted entry fields (on the stack): +% +% CURRENT_ITEM +% "PREVIOUS_ITEM +% +% which, in this example, is to eventually appear in the bibliography as: +% +% "PREVIOUS_ITEM," CURRENT_ITEM +% +% It is the job of the output routine to take the previous item off of the +% stack (while leaving the current item at the top of the stack), apply its +% trailing punctuation (including closing quote marks) and spacing, and then +% to write the result to BibTeX's output buffer: +% +% "PREVIOUS_ITEM," +% +% Punctuation (and spacing) between items is often determined by both of the +% items rather than just the first one. The presence of quotation marks +% further complicates the situation because, in standard English, trailing +% punctuation marks are supposed to be contained within the quotes. +% +% IEEEtran.bst maintains two output state (aka "status") vectors which +% correspond to the previous and current (aka "this") items. Each vector +% consists of several independent attributes which track punctuation, +% spacing, quotation, and newlines. Capitalization status is handled by a +% separate scalar because the format routines, not the output routine, +% handle capitalization and, therefore, there is no need to maintain the +% capitalization attribute for both the "previous" and "this" items. +% +% When a format routine adds a new item, it copies the current output status +% vector to the previous output status vector and (usually) resets the +% current (this) output status vector to a "standard status" vector. Using a +% "standard status" vector in this way allows us to redefine what we mean by +% "standard status" at the start of each entry handler and reuse the same +% format routines under the various inter-item separation schemes. For +% example, the standard status vector for the @book entry type may use +% commas for item separators, while the @electronic type may use periods, +% yet both entry handlers exploit many of the exact same format routines. +% +% Because format routines have write access to the output status vector of +% the previous item, they can override the punctuation choices of the +% previous format routine! Therefore, it becomes trivial to implement rules +% such as "Always use a period and a large space before the publisher." By +% pushing the generation of the closing quote mark to the output routine, we +% avoid all the problems caused by having to close a quote before having all +% the information required to determine what the punctuation should be. +% +% The IEEEtran.bst output state system can easily be expanded if needed. +% For instance, it is easy to add a "space.tie" attribute value if the +% bibliography rules mandate that two items have to be joined with an +% unbreakable space. + +FUNCTION {initialize.status.constants} +{ #0 'punct.no := + #1 'punct.comma := + #2 'punct.period := + #0 'space.no := + #1 'space.normal := + #2 'space.large := + #0 'quote.no := + #1 'quote.close := + #0 'cap.no := + #1 'cap.yes := + #0 'nline.no := + #1 'nline.newblock := +} + +FUNCTION {std.status.using.comma} +{ punct.comma 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.no 'cap.std := +} + +FUNCTION {std.status.using.period} +{ punct.period 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.yes 'cap.std := +} + +FUNCTION {initialize.prev.this.status} +{ punct.no 'prev.status.punct := + space.no 'prev.status.space := + quote.no 'prev.status.quote := + nline.no 'prev.status.nline := + punct.no 'this.status.punct := + space.no 'this.status.space := + quote.no 'this.status.quote := + nline.no 'this.status.nline := + cap.yes 'status.cap := +} + +FUNCTION {this.status.std} +{ punct.std 'this.status.punct := + space.std 'this.status.space := + quote.std 'this.status.quote := + nline.std 'this.status.nline := +} + +FUNCTION {cap.status.std}{ cap.std 'status.cap := } + +FUNCTION {this.to.prev.status} +{ this.status.punct 'prev.status.punct := + this.status.space 'prev.status.space := + this.status.quote 'prev.status.quote := + this.status.nline 'prev.status.nline := +} + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ { skip$ } + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + { skip$ } + if$ +} + + +% convert the strings "yes" or "no" to #1 or #0 respectively +FUNCTION {yes.no.to.int} +{ "l" change.case$ duplicate$ + "yes" = + { pop$ #1 } + { duplicate$ "no" = + { pop$ #0 } + { "unknown boolean " quote$ * swap$ * quote$ * + " in " * cite$ * warning$ + #0 + } + if$ + } + if$ +} + + +% pushes true if the single char string on the stack is in the +% range of "0" to "9" +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +% multiplies the integer on the stack by a factor of 10 +FUNCTION {bump.int.mag} +{ #0 'multiresult := + { duplicate$ #0 > } + { #1 - + multiresult #10 + + 'multiresult := + } + while$ +pop$ +multiresult +} + +% converts a single character string on the stack to an integer +FUNCTION {char.to.integer} +{ duplicate$ + is.num + { chr.to.int$ "0" chr.to.int$ - } + {"noninteger character " quote$ * swap$ * quote$ * + " in integer field of " * cite$ * warning$ + #0 + } + if$ +} + +% converts a string on the stack to an integer +FUNCTION {string.to.integer} +{ duplicate$ text.length$ 'namesleft := + #1 'nameptr := + #0 'numnames := + { nameptr namesleft > not } + { duplicate$ nameptr #1 substring$ + char.to.integer numnames bump.int.mag + + 'numnames := + nameptr #1 + + 'nameptr := + } + while$ +pop$ +numnames +} + + + + +% The output routines write out the *next* to the top (previous) item on the +% stack, adding punctuation and such as needed. Since IEEEtran.bst maintains +% the output status for the top two items on the stack, these output +% routines have to consider the previous output status (which corresponds to +% the item that is being output). Full independent control of punctuation, +% closing quote marks, spacing, and newblock is provided. +% +% "output.nonnull" does not check for the presence of a previous empty +% item. +% +% "output" does check for the presence of a previous empty item and will +% remove an empty item rather than outputing it. +% +% "output.warn" is like "output", but will issue a warning if it detects +% an empty item. + +FUNCTION {output.nonnull} +{ swap$ + prev.status.punct punct.comma = + { "," * } + { skip$ } + if$ + prev.status.punct punct.period = + { add.period$ } + { skip$ } + if$ + prev.status.quote quote.close = + { "''" * } + { skip$ } + if$ + prev.status.space space.normal = + { " " * } + { skip$ } + if$ + prev.status.space space.large = + { large.space * } + { skip$ } + if$ + write$ + prev.status.nline nline.newblock = + { newline$ "\newblock " write$ } + { skip$ } + if$ +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.warn} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +% "fin.entry" is the output routine that handles the last item of the entry +% (which will be on the top of the stack when "fin.entry" is called). + +FUNCTION {fin.entry} +{ this.status.punct punct.no = + { skip$ } + { add.period$ } + if$ + this.status.quote quote.close = + { "''" * } + { skip$ } + if$ +write$ +newline$ +} + + +FUNCTION {is.last.char.not.punct} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {is.multiple.pages} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ } + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +FUNCTION {do.name.latex.cmd} +{ name.latex.cmd + empty$ + { skip$ } + { name.latex.cmd "{" * swap$ * "}" * } + if$ +} + +% IEEEtran.bst uses its own \BIBforeignlanguage command which directly +% invokes the TeX hyphenation patterns without the need of the Babel +% package. Babel does a lot more than switch hyphenation patterns and +% its loading can cause unintended effects in many class files (such as +% IEEEtran.cls). +FUNCTION {select.language} +{ duplicate$ empty$ 'pop$ + { language empty$ 'skip$ + { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {space.word}{ " " swap$ * " " * } + + +% Field Conditioners, Converters, Checkers and External Interfaces + +FUNCTION {empty.field.to.null.string} +{ duplicate$ empty$ + { pop$ "" } + { skip$ } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + { pop$ } + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {empty.entry.warn} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ url empty$ + and and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + + +% The bibinfo system provides a way for the electronic parsing/acquisition +% of a bibliography's contents as is done by ReVTeX. For example, a field +% could be entered into the bibliography as: +% \bibinfo{volume}{2} +% Only the "2" would show up in the document, but the LaTeX \bibinfo command +% could do additional things with the information. IEEEtran.bst does provide +% a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is +% currently not used as the bogus bibinfo functions defined here output the +% entry values directly without the \bibinfo wrapper. The bibinfo functions +% themselves (and the calls to them) are retained for possible future use. +% +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. + +FUNCTION {bibinfo.check} +{ swap$ duplicate$ missing$ + { pop$ pop$ "" } + { duplicate$ empty$ + { swap$ pop$ } + { swap$ pop$ } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ duplicate$ missing$ + { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } + { duplicate$ empty$ + { swap$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ } + if$ + } + if$ +} + + +% IEEE separates large numbers with more than 4 digits into groups of +% three. IEEE uses a small space to separate these number groups. +% Typical applications include patent and page numbers. + +% number of consecutive digits required to trigger the group separation. +FUNCTION {large.number.trigger}{ #5 } + +% For numbers longer than the trigger, this is the blocksize of the groups. +% The blocksize must be less than the trigger threshold, and 2 * blocksize +% must be greater than the trigger threshold (can't do more than one +% separation on the initial trigger). +FUNCTION {large.number.blocksize}{ #3 } + +% What is actually inserted between the number groups. +FUNCTION {large.number.separator}{ "\," } + +% So as to save on integer variables by reusing existing ones, numnames +% holds the current number of consecutive digits read and nameptr holds +% the number that will trigger an inserted space. +FUNCTION {large.number.separate} +{ 't := + "" + #0 'numnames := + large.number.trigger 'nameptr := + { t empty$ not } + { t #-1 #1 substring$ is.num + { numnames #1 + 'numnames := } + { #0 'numnames := + large.number.trigger 'nameptr := + } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames nameptr = + { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$ + nameptr large.number.blocksize - #1 + global.max$ substring$ + large.number.separator swap$ * * + nameptr large.number.blocksize - 'numnames := + large.number.blocksize #1 + 'nameptr := + } + { skip$ } + if$ + } + while$ +} + +% Converts all single dashes "-" to double dashes "--". +FUNCTION {n.dashify} +{ large.number.separate + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +% This function detects entries with names that are identical to that of +% the previous entry and replaces the repeated names with dashes (if the +% "is.dash.repeated.names" user control is nonzero). +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { is.dash.repeated.names + { repeated.name.dashes } + { s 'oldname := s } + if$ + } + { s 'oldname := s } + if$ + } + if$ +} + +% Converts the number string on the top of the stack to +% "numerical ordinal form" (e.g., "7" to "7th"). There is +% no artificial limit to the upper bound of the numbers as the +% least significant digit always determines the ordinal form. +FUNCTION {num.to.ordinal} +{ duplicate$ #-1 #1 substring$ "1" = + { bbl.st * } + { duplicate$ #-1 #1 substring$ "2" = + { bbl.nd * } + { duplicate$ #-1 #1 substring$ "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ +} + +% If the string on the top of the stack begins with a number, +% (e.g., 11th) then replace the string with the leading number +% it contains. Otherwise retain the string as-is. s holds the +% extracted number, t holds the part of the string that remains +% to be scanned. +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +% Converts the word number string on the top of the stack to +% Arabic string form. Will be successful up to "tenth". +FUNCTION {word.to.num} +{ duplicate$ "l" change.case$ 's := + s "first" = + { pop$ "1" } + { skip$ } + if$ + s "second" = + { pop$ "2" } + { skip$ } + if$ + s "third" = + { pop$ "3" } + { skip$ } + if$ + s "fourth" = + { pop$ "4" } + { skip$ } + if$ + s "fifth" = + { pop$ "5" } + { skip$ } + if$ + s "sixth" = + { pop$ "6" } + { skip$ } + if$ + s "seventh" = + { pop$ "7" } + { skip$ } + if$ + s "eighth" = + { pop$ "8" } + { skip$ } + if$ + s "ninth" = + { pop$ "9" } + { skip$ } + if$ + s "tenth" = + { pop$ "10" } + { skip$ } + if$ +} + + +% Converts the string on the top of the stack to numerical +% ordinal (e.g., "11th") form. +FUNCTION {convert.edition} +{ duplicate$ empty$ 'skip$ + { duplicate$ #1 #1 substring$ is.num + { extract.num + num.to.ordinal + } + { word.to.num + duplicate$ #1 #1 substring$ is.num + { num.to.ordinal } + { "edition ordinal word " quote$ * edition * quote$ * + " may be too high (or improper) for conversion" * " in " * cite$ * warning$ + } + if$ + } + if$ + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LATEX BIBLIOGRAPHY CODE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.entry} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + initialize.prev.this.status +} + +% Here we write out all the LaTeX code that we will need. The most involved +% code sequences are those that control the alternate interword spacing and +% foreign language hyphenation patterns. The heavy use of \providecommand +% gives users a way to override the defaults. Special thanks to Javier Bezos, +% Johannes Braams, Robin Fairburns, Heiko Oberdiek, Donald Arseneau and all +% the other gurus on comp.text.tex for their help and advice on the topic of +% \selectlanguage, Babel and BibTeX. +FUNCTION {begin.bib} +{ preamble$ empty$ 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{#1}" + write$ newline$ + "\def\UrlFont{\rmfamily}" + write$ newline$ + "\providecommand{\newblock}{\relax}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand\BIBentrySTDinterwordspacing{\spaceskip=0pt\relax}" + write$ newline$ + "\providecommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + "\providecommand\BIBentryALTinterwordspacing{\spaceskip=\fontdimen2\font plus " + write$ newline$ + "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}" + write$ newline$ + "\providecommand\BIBforeignlanguage[2]{{%" + write$ newline$ + "\expandafter\ifx\csname l@#1\endcsname\relax" + write$ newline$ + "\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}%" + write$ newline$ + "\typeout{** loaded for the language `#1'. Using the pattern for}%" + write$ newline$ + "\typeout{** the default language instead.}%" + write$ newline$ + "\else" + write$ newline$ + "\language=\csname l@#1\endcsname" + write$ newline$ + "\fi" + write$ newline$ + "#2}}" + write$ newline$ +} + +FUNCTION {end.bib} +{ newline$ "\end{thebibliography}" write$ newline$ } + +FUNCTION {if.url.alt.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + +FUNCTION {if.url.std.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%% +%% LONGEST LABEL PASS %% +%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%% +%% FORMAT HANDLERS %% +%%%%%%%%%%%%%%%%%%%%% + +%% Lower Level Formats (used by higher level formats) + +FUNCTION {format.address.org.or.pub.date} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + { skip$ } + if$ + address empty$ t empty$ and + year empty$ and month empty$ and + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + address "address" bibinfo.check * + t empty$ + { skip$ } + { punct.period 'prev.status.punct := + space.large 'prev.status.space := + address empty$ + { skip$ } + { ": " * } + if$ + t * + } + if$ + year empty$ month empty$ and + { skip$ } + { t empty$ address empty$ and + { skip$ } + { ", " * } + if$ + month empty$ + { year empty$ + { skip$ } + { year "year" bibinfo.check * } + if$ + } + { month "month" bibinfo.check * + year empty$ + { skip$ } + { " " * year "year" bibinfo.check * } + if$ + } + if$ + } + if$ + } + if$ +} + + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + this.to.prev.status + this.status.std + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + name.format.string + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { nameptr num.names.shown.with.forced.et.al #1 + = + numnames max.num.names.before.forced.et.al > + is.forced.et.al and and + { "others" 't := + #1 'namesleft := + } + { skip$ } + if$ + namesleft #1 > + { ", " * t do.name.latex.cmd * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal emphasize * + } + { + bbl.and + space.word * t do.name.latex.cmd * + } + if$ + } + if$ + } + { t do.name.latex.cmd } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + cap.status.std + } if$ +} + + + + +%% Higher Level Formats + +%% addresses/locations + +FUNCTION {format.address} +{ address duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% author/editor names + +FUNCTION {format.authors}{ author "author" format.names } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { ", " * + get.bbl.editor + capitalize + * + } + if$ +} + + + +%% date + +FUNCTION {format.date} +{ + month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { this.to.prev.status + this.status.std + cap.status.std + swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ +} + +FUNCTION {format.date.electronic} +{ month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ + { pop$ } + { "there's a month but no year in " cite$ * warning$ + pop$ ")" * "(" swap$ * + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ + } + { swap$ + { swap$ pop$ ")" * "(" swap$ * } + { "(" swap$ * ", " * swap$ * ")" * } + if$ + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ +} + + + +%% edition/title + +% Note: IEEE considers the edition to be closely associated with +% the title of a book. So, in IEEEtran.bst the edition is normally handled +% within the formatting of the title. The format.edition function is +% retained here for possible future use. +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + convert.edition + status.cap + { "t" } + { "l" } + if$ change.case$ + "edition" bibinfo.check + "~" * bbl.edition * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of a conference proceedings. +% Here we use the "intype" field to provide the user a way to +% override the word "in" (e.g., with things like "presented at") +% Use of intype stops the emphasis of the booktitle to indicate that +% we no longer mean the written conference proceedings, but the +% conference itself. +FUNCTION {format.in.booktitle} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + intype missing$ + { emphasize + bbl.in " " * + } + { intype " " * } + if$ + swap$ * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of collection. +% Here the "intype" field is not supported, but "edition" is. +FUNCTION {format.in.booktitle.edition} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + "l" change.case$ + * "~" * bbl.edition * + } + if$ + bbl.in " " * swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { quote.close 'this.status.quote := + is.last.char.not.punct + { punct.std 'this.status.punct := } + { punct.no 'this.status.punct := } + if$ + select.language + "``" swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title.electronic} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ + { skip$ } + { select.language } + if$ +} + +FUNCTION {format.book.title.edition} +{ title "title" bibinfo.check + duplicate$ empty$ + { "empty title in " cite$ * warning$ } + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + status.cap + { "t" } + { "l" } + if$ + change.case$ + * "~" * bbl.edition * + } + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.book.title} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% journal + +FUNCTION {format.journal} +{ journal duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% how published + +FUNCTION {format.howpublished} +{ howpublished duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% institutions/organization/publishers/school + +FUNCTION {format.institution} +{ institution duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.organization} +{ organization duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.address.publisher.date} +{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date } + +FUNCTION {format.address.publisher.date.nowarn} +{ publisher "publisher" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.address.organization.date} +{ organization "organization" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.school} +{ school duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% volume/number/series/chapter/pages + +FUNCTION {format.volume} +{ volume empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + bbl.volume + status.cap + { capitalize } + { skip$ } + if$ + swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number} +{ number empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + status.cap + { bbl.number capitalize } + { bbl.number } + if$ + swap$ tie.or.space.prefix + "number" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number.if.use.for.article} +{ is.use.number.for.article + { format.number } + { "" } + if$ +} + +% IEEE does not seem to tie the series so closely with the volume +% and number as is done in other bibliography styles. Instead the +% series is treated somewhat like an extension of the title. +FUNCTION {format.series} +{ series empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.series " " * + series "series" bibinfo.check * + cap.status.std + } + if$ +} + + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { this.to.prev.status + this.status.std + type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + cap.status.std + } + if$ +} + + +% The intended use of format.paper is for paper numbers of inproceedings. +% The paper type can be overridden via the type field. +% We allow the type to be displayed even if the paper number is absent +% for things like "postdeadline paper" +FUNCTION {format.paper} +{ is.use.paper + { paper empty$ + { type empty$ + { "" } + { this.to.prev.status + this.status.std + type "type" bibinfo.check + cap.status.std + } + if$ + } + { this.to.prev.status + this.status.std + type empty$ + { bbl.paper } + { type "type" bibinfo.check } + if$ + " " * paper + "paper" bibinfo.check + * + cap.status.std + } + if$ + } + { "" } + if$ +} + + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + duplicate$ is.multiple.pages + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + cap.status.std + } + if$ +} + + + +%% technical report number + +FUNCTION {format.tech.report.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ + this.to.prev.status + this.status.std + cap.status.std + bbl.techrep + } + { skip$ } + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ } + { this.to.prev.status + this.status.std + cap.status.std + tie.or.space.prefix * * } + if$ +} + + + +%% note + +FUNCTION {format.note} +{ note empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + note #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + + +%% patent + +FUNCTION {format.patent.date} +{ this.to.prev.status + this.status.std + year empty$ + { monthfiled duplicate$ empty$ + { "monthfiled" bibinfo.check pop$ "" } + { "monthfiled" bibinfo.check } + if$ + dayfiled duplicate$ empty$ + { "dayfiled" bibinfo.check pop$ "" * } + { "dayfiled" bibinfo.check + monthfiled empty$ + { "dayfiled without a monthfiled in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + yearfiled empty$ + { "no year or yearfiled in " cite$ * warning$ } + { yearfiled "yearfiled" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + } + { month duplicate$ empty$ + { "month" bibinfo.check pop$ "" } + { "month" bibinfo.check } + if$ + day duplicate$ empty$ + { "day" bibinfo.check pop$ "" * } + { "day" bibinfo.check + month empty$ + { "day without a month in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + year "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + cap.status.std +} + +FUNCTION {format.patent.nationality.type.number} +{ this.to.prev.status + this.status.std + nationality duplicate$ empty$ + { "nationality" bibinfo.warn pop$ "" } + { "nationality" bibinfo.check + duplicate$ "l" change.case$ "united states" = + { pop$ bbl.patentUS } + { skip$ } + if$ + " " * + } + if$ + type empty$ + { bbl.patent "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.warn pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + + + +%% standard + +FUNCTION {format.organization.institution.standard.type.number} +{ this.to.prev.status + this.status.std + organization duplicate$ empty$ + { pop$ + institution duplicate$ empty$ + { "institution" bibinfo.warn } + { "institution" bibinfo.warn " " * } + if$ + } + { "organization" bibinfo.warn " " * } + if$ + type empty$ + { bbl.standard "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.check pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + +FUNCTION {format.revision} +{ revision empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.revision + revision tie.or.space.prefix + "revision" bibinfo.check + * * + cap.status.std + } + if$ +} + + +%% thesis + +FUNCTION {format.master.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.mthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + +FUNCTION {format.phd.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.phdthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + + + +%% URL + +FUNCTION {format.url} +{ url empty$ + { "" } + { this.to.prev.status + this.status.std + cap.yes 'status.cap := + bbl.urlprefix " " * + "\url{" * url * "}" * + punct.no 'this.status.punct := + punct.period 'prev.status.punct := + space.normal 'this.status.space := + space.normal 'prev.status.space := + quote.no 'this.status.quote := + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%% +%% ENTRY HANDLERS %% +%%%%%%%%%%%%%%%%%%%% + + +% Note: In many journals, IEEE (or the authors) tend not to show the number +% for articles, so the display of the number is controlled here by the +% switch "is.use.number.for.article" +FUNCTION {article} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.journal "journal" bibinfo.check "journal" output.warn + format.volume output + format.number.if.use.for.article output + format.pages output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {book} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + author empty$ + { skip$ } + { format.editors output } + if$ + format.address.publisher.date output + format.volume output + format.number output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {booklet} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {electronic} +{ std.status.using.period + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.date.electronic output + format.article.title.electronic output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {inbook} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + format.address.publisher.date output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {incollection} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle.edition "booktitle" output.warn + format.series output + format.editors output + format.address.publisher.date.nowarn output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {inproceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle "booktitle" output.warn + format.series output + format.editors output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.paper output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {manual} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title.edition "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {mastersthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.master.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {misc} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.pages output + format.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {patent} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.patent.nationality.type.number output + format.patent.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {periodical} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + format.organization "organization" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {phdthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.phd.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {proceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {standard} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization.institution.standard.type.number output + format.revision output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {techreport} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.institution "institution" bibinfo.warn output + format.address "address" bibinfo.check output + format.tech.report.number output.nonnull + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {unpublished} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.date output + format.note "note" output.warn + format.url output + fin.entry + if.url.std.interword.spacing +} + + +% The special entry type which provides the user interface to the +% BST controls +FUNCTION {IEEEtranBSTCTL} +{ is.print.banners.to.terminal + { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." * + top$ + } + { skip$ } + if$ + CTLuse_article_number + empty$ + { skip$ } + { CTLuse_article_number + yes.no.to.int + 'is.use.number.for.article := + } + if$ + CTLuse_paper + empty$ + { skip$ } + { CTLuse_paper + yes.no.to.int + 'is.use.paper := + } + if$ + CTLuse_forced_etal + empty$ + { skip$ } + { CTLuse_forced_etal + yes.no.to.int + 'is.forced.et.al := + } + if$ + CTLmax_names_forced_etal + empty$ + { skip$ } + { CTLmax_names_forced_etal + string.to.integer + 'max.num.names.before.forced.et.al := + } + if$ + CTLnames_show_etal + empty$ + { skip$ } + { CTLnames_show_etal + string.to.integer + 'num.names.shown.with.forced.et.al := + } + if$ + CTLuse_alt_spacing + empty$ + { skip$ } + { CTLuse_alt_spacing + yes.no.to.int + 'is.use.alt.interword.spacing := + } + if$ + CTLalt_stretch_factor + empty$ + { skip$ } + { CTLalt_stretch_factor + 'ALTinterwordstretchfactor := + "\renewcommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + } + if$ + CTLdash_repeated_names + empty$ + { skip$ } + { CTLdash_repeated_names + yes.no.to.int + 'is.dash.repeated.names := + } + if$ + CTLname_format_string + empty$ + { skip$ } + { CTLname_format_string + 'name.format.string := + } + if$ + CTLname_latex_cmd + empty$ + { skip$ } + { CTLname_latex_cmd + 'name.latex.cmd := + } + if$ + + + num.names.shown.with.forced.et.al max.num.names.before.forced.et.al > + { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ + max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al := + } + { skip$ } + if$ +} + + +%%%%%%%%%%%%%%%%%%% +%% ENTRY ALIASES %% +%%%%%%%%%%%%%%%%%%% +FUNCTION {conference}{inproceedings} +FUNCTION {online}{electronic} +FUNCTION {internet}{electronic} +FUNCTION {webpage}{electronic} +FUNCTION {default.type}{misc} + + + +%%%%%%%%%%%%%%%%%% +%% MAIN PROGRAM %% +%%%%%%%%%%%%%%%%%% + +READ + +EXECUTE {initialize.controls} +EXECUTE {initialize.status.constants} +EXECUTE {banner.message} + +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} + +EXECUTE {begin.bib} +ITERATE {call.type$} +EXECUTE {end.bib} + +EXECUTE{completed.message} + + +%% That's all folks, mds. diff --git a/abstract.tex b/abstract.tex new file mode 100644 index 0000000..f20561d --- /dev/null +++ b/abstract.tex @@ -0,0 +1,7 @@ +This document records the development-environment configuration for the first +SSW 590 assignment. It describes the Kanban board used to plan and track the +work, the hosts the environment will comprise, and the password rules that +will govern accounts on those hosts. The environment is specified here as a +plan; provisioning and its supporting evidence are deferred to a later +submission. Password rules are recorded as derivation hints, so that no +credential appears in this document. \ No newline at end of file diff --git a/cornell.cls b/cornell.cls new file mode 100644 index 0000000..79b37eb --- /dev/null +++ b/cornell.cls @@ -0,0 +1,367 @@ +%% +%% This is file `cornell.cls', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% cornell.dtx (with options: `class') +%% +%% IMPORTANT NOTICE: +%% +%% For the copyright see the source file. +%% +%% Any modified versions of this file must be renamed +%% with new filenames distinct from cornell.cls. +%% +%% For distribution of the original source see the terms +%% for copying and modification in the file cornell.dtx. +%% +%% This generated file may be distributed as long as the +%% original source files, as listed above, are part of the +%% same distribution. (The sources need not necessarily be +%% in the same archive or directory.) +%% Document class `cornell' to use with LaTeX 2e. +%% Based on `crnlphd' class. The following is from the file `crnlphd.dtx': +%% Based loosely on old cuphdthesis style file. +%% Found to give good results, according to the thesis secretary. +%% File: crnlphd.dtx Copyright (C) 1994 Sergio Gelato +%% Made available without any warranty, express or implied. +%% Modifications +%% 03/26/98 Mike Heisler +%% Conform to Eric's final version. Margins are subject to +%% The whim of the printer. +%% 10/10/97 Mike Heisler and Eric Dahl +%% Altered footnotesize and changed the Acknowledgement and +%% Biographical titles per thesis secretary guideline that +%% they must match the rest of the document, i.e. flush left +%% and capitalized rather than all caps +%% 05/21/97 Mike Heisler +%% Added a 'papers' option to handle bibliographis as sections +%% at the end of each chapter. Reduced top margin. +%% +%% $Id$ +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{cornell} +[1998/03/26 v2.0 + Cornell University thesis class] +\newif\ifphd +\DeclareOption{phd}{\phdtrue} +\DeclareOption{master}{\phdfalse} +\ExecuteOptions{phd} +\newif\ifpapers +\DeclareOption{papers}{\paperstrue} +\DeclareOption{10pt}{% + \OptionNotUsed% + \ClassWarningNoLine{cornell}{Font size 10pt not allowed; using 12pt}% +} +\DeclareOption{11pt}{% + \OptionNotUsed% + \ClassWarningNoLine{cornell}{Font size 11pt not allowed; using 12pt}% +} +\newcommand{\prelim@contents}[1]{} +\DeclareOption{tocprelim}{% + \renewcommand{\prelim@contents}[1]{\addcontentsline{toc}{section}{#1}} +} +\DeclareOption*{% + \PassOptionsToClass{\CurrentOption}{report}% +} +\ProcessOptions + +\LoadClass[12pt]{report}[1994/06/01] +\renewcommand{\defaultscriptratio}{.75} +\renewcommand{\defaultscriptscriptratio}{.6} +\setlength\headsep{25\p@} +\if@twocolumn +\else + \setlength\oddsidemargin{0in} + \setlength\evensidemargin{0in} + \setlength\textwidth{6.5in} + \setlength\topmargin{-0.5in} + \setlength\headheight{0.2in} + \setlength\headsep{0.35in} + \setlength\textheight{8.85in} + \setlength\footskip{0.5in} + \setlength\marginparwidth{0.85in} + \setlength\marginparsep{0.125in} +\fi +\if@compatibility + \setlength\topmargin{0\p@} +\else +\fi +\newcommand{\ps@cornell}{% +\def\@oddhead{{\slshape\rightmark}\hfil\thepage}% +\def\@oddfoot{}% +\def\@evenhead{\thepage\hfil{\slshape\leftmark}}% +\def\@evenfoot{}% +\def\chaptermark##1{}% +\def\sectionmark##1{}% +} +\newcommand{\ps@cornellc}{% +\def\@oddhead{\hfil\thepage\hfil}% +\def\@oddfoot{}% +\def\@evenhead{\@oddhead}% +\def\@evenfoot{}% +\def\chaptermark##1{}% +\def\sectionmark##1{}% +} +\raggedbottom +\newcommand{\@prolformat}[1]{{\begin{flushleft} \Huge #1 \end{flushleft}} } +\newcommand{\ackname}{\@prolformat{Acknowledgements}} +\newcommand{\bioname}{\@prolformat{Biographical Sketch}} +\renewcommand{\contentsname}{\@prolformat{Table of Contents}} +\renewcommand{\listtablename}{\@prolformat{List of Tables}} +\renewcommand{\listfigurename}{\@prolformat{List of Figures}} +\renewcommand{\l@figure}{\@dottedtocline{1}{1.5em}{2.6em}} +\let\l@table\l@figure + +\renewenvironment{thebibliography}[1] + {\ifpapers \clearpage \section*{\bibname% + \@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}% + \else% + \chapter*{\bibname% + \@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}% + \fi% + \list{\@biblabel{\arabic{enumiv}}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\arabic{enumiv}}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m\relax + \ifpapers% + \addcontentsline{toc}{section}{\bibname}% + \else% + \addcontentsline{toc}{chapter}{\bibname}% + \fi + \singlespacing} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \normalspacing + \endlist} + +\newcommand{\@titlesize}{\Large} +\newcommand{\@subtitlesize}{\large} +\newcommand{\@authorsize}{\normalsize} % No Pharaoh he. +\newcommand{\@conferralmonth}{January} +\newcommand{\@conferralyear}{} + +\newcommand{\titlesize}[1]{\renewcommand{\@titlesize}{#1}} +\newcommand{\subtitlesize}[1]{\renewcommand{\@subtitlesize}{#1}} +\newcommand{\authorsize}[1]{\renewcommand{\@authorsize}{#1}} +\newcommand{\conferraldate}[2]{% + \renewcommand{\@conferralmonth}{#1} + \renewcommand{\@conferralyear}{#2} +} +\newcommand{\@degreefield}{Master of Science} %CHANGED +\newcommand{\degreefield}[1]{\renewcommand{\@degreefield}{#1}} %CHANGED + +\renewcommand{\maketitle}{% + \begin{titlepage}% + \vspace*{-0.24in} + \begin{center}% + \@titlesize \@title + \end{center} + \vfill + %\begin{center} + %\@subtitlesize + %A \ifphd Dissertation \else Thesis \fi \\ %CHANGED + %Presented to the Faculty of the Graduate School \\ + %of Cornell University \\ + %in Partial Fulfillment of the Requirements for the Degree of \\ + %\ifphd Doctor of Philosophy \else \@degreefield \fi %CHANGED + %\end{center} + \vfill + \begin{center} + \@authorsize + by \\ + \@author \\ + \@conferralmonth\ \@conferralyear + \end{center} + \vspace*{0.26in} + \end{titlepage} +} + +\renewenvironment{titlepage}{% + \typeout{Title page} + \pagestyle{empty} + \doublespacing +}{% + \normalspacing\clearpage +} + + +\newenvironment{copyrightpage}{% + \typeout{Copyleft page} + \pagestyle{empty} + \null\vfil + \begin{center} +}{% + \end{center} + \vfil\null + \clearpage +} + +\newcommand{\makecopyright}{% + \begin{copyrightpage} + \copyright\ \@copyrightholder\ \@copyrightyear \\ + ALL RIGHTS RESERVED \\[.5in] + \end{copyrightpage} +} +\newcommand{\@copyrightholder}{\@author} +\newcommand{\@copyrightyear}{\@conferralyear} + +\newcommand{\copyrightholder}[1]{\renewcommand{\@copyrightholder}{#1}} +\newcommand{\copyrightyear}[1]{\renewcommand{\@copyrightyear}{#1}} + + +\newlength{\@abhdskip} +\renewenvironment{abstract}{% + \typeout{Abstract} + \singlespacing + \ifphd %CHANGED + \setlength{\@abhdskip}{.25in} + \addtolength{\@abhdskip}{-\topmargin} + \vspace*{\@abhdskip} + \begin{center} + \@abstracttitle \\ + \ \\ + \@author \\ + \@conferralyear + \end{center} + \vspace{.25in} + \else %CHANGED + \chapter*{% + \begin{center} + \normalsize + ABSTRACT + \end{center} + } + \par + \fi %CHANGED + \pagestyle{empty} + \thispagestyle{empty} +}{% + \clearpage +} + +\newcommand{\@abstracttitle}{\@title} +\newcommand{\abstracttitle}[1]{\renewcommand{\@abstracttitle}{#1}} + + +\newenvironment{biosketch}{% + \typeout{Vita} + \pagestyle{plain} + \pagenumbering{roman} + \setcounter{page}{3} + \prelim@contents{Biographical Sketch} + \chapter*{% +\bioname + } + \par +}{% + \clearpage +} + +\newenvironment{dedication}{% + \prelim@contents{Dedication} + \null\vfil + \begin{center} +}{ + \end{center} + \vfil\null + \clearpage +} + +\newenvironment{acknowledgements}{% + \prelim@contents{Acknowledgments} + \chapter*{% +\ackname + } + \par +}{% + \cleardoublepage +} + +\newcommand{\contentspage}{% + \singlespacing + \label{toc} + \prelim@contents{\contentsname} + \tableofcontents + \normalspacing + \clearpage +} + +\newcommand{\tablelistpage}{% + \singlespacing + \label{lot} + \prelim@contents{\listtablename} + \listoftables + \normalspacing + \clearpage +} + +\newcommand{\figurelistpage}{% + \singlespacing + \label{lof} + \prelim@contents{\listfigurename} + \listoffigures + \normalspacing + \clearpage +} +\newcommand{\abbrlist}{% + \singlespacing + \prelim@contents{List of Abbreviations} + \chapter*{List of Abbreviations} +} + +\newcommand{\symlist}{% + \singlespacing + \prelim@contents{List of Symbols} + \chapter*{List of Symbols} +} + +\newcommand{\preface}{% + \singlespacing + \prelim@contents{Preface} + \chapter*{Preface} +} + +\newcommand{\singlespacing}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{1.0}\tiny\CS} +\newcommand{\singlespacingplus}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{1.25}\tiny\CS} +\newcommand{\doublespacing}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{1.75}\tiny\CS} +\newcommand{\realdoublespacing}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{2}\tiny\CS} +\newcommand{\normalspacing}{\doublespacing} +\newcommand{\footnotespacing}{\singlespacing} +\newcommand{\changespacing}[2]{% + \renewcommand{#1}{% + \let\CS=\@currsize\renewcommand{\baselinestretch}{#2}\tiny\CS}% +} +\newcommand{\changenormalspacing}[1]{\renewcommand{\normalspacing}{#1}} +\normalspacing + +\endinput +%% +%% End of file `cornell.cls'. diff --git a/devopsAIAgentGuide.tex b/devopsAIAgentGuide.tex new file mode 100644 index 0000000..608fffe --- /dev/null +++ b/devopsAIAgentGuide.tex @@ -0,0 +1,107 @@ +\chapter{AI Agent Usage Guide} +\ChapterLabel{AIAgentGuide} +\index{AI agent} +\index{AI agent!DevOps workflow} +\index{Appendix!AI Agent Usage Guide} + +\section{How to Use This Appendix} +An AI agent that creates, reviews, or maintains an assignment shall read this +file first. It shall identify the task in the routing table, read the minimum +authoritative sources, and expand context only for a discovered dependency or +inconsistency. This guide is maintained in LaTeX so it is visible, versioned, +and reviewable with the assignment. + +\section{Governing Principles} +The authored LaTeX files, versioned automation, and approved assignment +materials are authoritative. The PDF is a review artifact and shall not be +edited directly. AI may draft, explain, analyze, check consistency, and assist +with builds. It shall not invent completion, evidence, access, costs, grades, +approvals, command output, security posture, or operational results. + +\section{Chapter File Convention} +\index{AI agent!chapter file convention} +Every assignment chapter shall be stored in exactly one file named with the +\texttt{devops} prefix, a PascalCase chapter name, and the \texttt{.tex} +suffix. For example, Chapter~2 is fully contained in +\path{devopsExampleAssignment.tex}. A chapter file shall begin with its +\texttt{\string\chapter\{...\}} command and contain all of that chapter's +sections and subsections. Do not split one chapter across files, create +section-only \texttt{.tex} files, or use \texttt{\string\input} or +\texttt{\string\include} to assemble a chapter from smaller fragments. + +Supporting non-chapter files may use a different name only when they are not +chapter content: \texttt{prologue.tex}, \texttt{abstract.tex}, +\texttt{devopsGlossary.tex}, and \texttt{devopsReferences.bib} are examples. +Appendix chapters follow the same chapter-file convention. + +\section{AI Quick Start} +\begin{enumerate} +\item Read this guide and identify the requested outcome. +\item Select the closest task below and load only its listed sources. +\item Inspect supplied facts and report consequential gaps or assumptions. +\item Make narrowly scoped changes; preserve stable IDs, glossary terms, and history. +\item Never request, print, store, or commit credentials, tokens, personal data, or production data. +\item Build the complete PDF, inspect the log, visually inspect affected pages, and record material AI use in \ChapterRef{AIPromptLog}. +\end{enumerate} + +\section{Task Routing} +\small +\begin{tabularx}{\linewidth}{L{4.0cm}Y} +\caption{AI Task-Routing Table\label{Table:AITaskRouting}}\\ +\toprule \textbf{Task} & \textbf{Minimum authoritative sources}\\ \midrule +Initialize an assignment & \texttt{devopsAssignment.tex}, \texttt{prologue.tex}, \texttt{devopsIntroduction.tex}, \texttt{devopsExampleAssignment.tex}, and the instructor's assignment facts.\\ +Develop a workflow & \texttt{devopsExampleAssignment.tex}, source repository materials, and authorized environment constraints.\\ +Define evidence & \texttt{devopsExampleAssignment.tex} and controlled execution outputs.\\ +Review a retrospective & \texttt{devopsExampleAssignment.tex} and the submitted workflow or runbook.\\ +Edit AI guidance & \texttt{devopsAIAgentGuide.tex}, \texttt{devopsAIPromptLog.tex}, \texttt{devopsDocumentGuide.tex}, and \texttt{devopsAssignment.tex}.\\ +Compile or troubleshoot & \texttt{devopsAssignment.tex}, \texttt{devopsDocumentGuide.tex}, the affected chapter, and the build log.\\ \bottomrule +\end{tabularx} +\normalsize + +\section{DevOps-Specific Rules} +\begin{enumerate} +\item Prefer versioned, repeatable automation over undocumented manual steps. +\item Treat deployment output, monitoring data, and screenshots as evidence only when they reflect an actual execution. +\item Design failure exercises to be isolated, reversible, and authorized. +\item Apply least privilege and never place secrets in LaTeX, source control, prompts, screenshots, or logs. +\item State expected cloud cost, cleanup action, and resource ownership for each remote-environment activity. +\item Identify whether a recommendation is a proposal, an instructor directive, or demonstrated evidence. +\end{enumerate} + +\section{Example AI Requests} +\subsection{Create an Assignment Brief} +\begin{verbatim} +Read devopsAIAgentGuide.tex and use the Initialize an Assignment context. +From the supplied SSW 590 objective and constraints, fill only supported +placeholders in the introduction and activity brief. Propose clear, observable +completion criteria, a safe cleanup action, and a rubric. Do not invent cloud +access, due dates, policy, costs, or approved tools. Update history, compile, +and report instructor decisions still needed. +\end{verbatim} + +\subsection{Review a Student Workflow} +\begin{verbatim} +Read devopsAIAgentGuide.tex and the workflow, evidence, and retrospective +chapters. Review the supplied repository and sanitized evidence for +reproducibility, least privilege, observability, rollback, and cleanup. +Separate verified facts from gaps and recommendations. Do not claim that an +unexecuted command passed, and do not request credentials or operate resources. +\end{verbatim} + +\section{Human Decisions and Information Boundaries} +The instructor retains authority over assignment scope, grading, due dates, +approved tooling, access, budgets, security posture, exceptions, and policy. +An AI agent shall surface alternatives and evidence, not represent a decision +as approved. Record material prompts, assumptions, corrections, and unresolved +issues in \ChapterRef{AIPromptLog}. + +\section{Completion Checklist} +\begin{itemize} +\item Scope, deliverables, environment, constraints, and cleanup are clear. +\item Activity identifiers and evidence references are valid and unique. +\item Examples contain no secrets, personal data, or unsafe production actions. +\item New controlled terms are added to the glossary and indexed. +\item The newest approved change is recorded in document history. +\item The complete build succeeds with no unresolved references or missing files. +\item A human reviews all decisions requiring instructional or operational authority. +\end{itemize} diff --git a/devopsAIPromptLog.tex b/devopsAIPromptLog.tex new file mode 100644 index 0000000..4644b11 --- /dev/null +++ b/devopsAIPromptLog.tex @@ -0,0 +1,49 @@ +\chapter{AI Prompt Log} +\ChapterLabel{AIPromptLog} +\index{AI prompt log} +\index{AI assistance} + +\section{Scope of Assistance} +This appendix records the \gls{ai} assistance used in preparing this document, +in the detail needed for a reviewer to see what was requested, what was +returned, and what the author changed. Assistance was used for interpreting the +assignment brief, drafting chapter text, and reviewing the document for internal +consistency. It was not used to generate command output, evidence, or any claim +about work that was not performed. No credential, key, or personal data was +supplied to the tool. Every decision recorded below was made by the author; the assistant's role was +to propose and to check. + +\section{Records} + +\subsection{Record 1 --- Document Interpretation and Restructuring} +\textbf{Date:} September 17, 2026.\\ +\textbf{Tool and model:} Anthropic Claude (Opus 5).\\ +\textbf{Task:} Determine what was expected by this assignment given its +instructions and the document template; then identify which parts of the template +belong in a submitted report and trim/modify unnecessary sections.\\ +\textbf{Inputs:} The assignment brief and the supplied \LaTeX\ template sources.\\ +\textbf{Output used:} Removal of the instructional example chapter and the +template-maintenance appendices; rewritten abstract, introduction, and document +history; corrected document metadata and authorship.\\ +\textbf{Human review and corrections:} The assistant explained assignment expectations +and received clarification from the author according to class and lecture content. +The assistant provided a guideline on which template sections should be kept, removed, +or modified. The author identified sections that were erroneously retained and modified +the AI outputs heavily in the final iteration to match the scope of the assignment and lectures so far. + +\subsection{Record 2 --- Chapter Drafting} +\textbf{Date:} September 18, 2026.\\ +\textbf{Tool and model:} Anthropic Claude (Opus 5).\\ +\textbf{Task:} Review the configured Kanban board and draft \ChapterRef{KanbanSetup}, +then draft \ChapterRef{Hosts} and \ChapterRef{Passwords} according to the author's plans. +Update the AI log once all changes are finalized.\\ +\textbf{Inputs:} A screenshot of the board and its column settings; the +intended platform and naming convention, and the access model already decided +by the author. No passwords, nor their hints or rules, were shared with the assistant.\\ +\textbf{Output used:} The Kanban chapter structure, its column policy, and card +inventory tables; the host inventory and its naming convention; the +split of accounts into generated and derived classes.\\ +\textbf{Human review and corrections:} The author determined the column policy +and work-in-progress criteria, and rejected a proposal to create a GitHub +organization as premature while teams remain unformalized. Much of the assistant's +wording, structure, and ambitious ideas were rejected for overcomplication. \ No newline at end of file diff --git a/devopsAssignment.tex b/devopsAssignment.tex new file mode 100644 index 0000000..38515b0 --- /dev/null +++ b/devopsAssignment.tex @@ -0,0 +1,126 @@ +% SSW 590 DevOps Assignment Template +% Developed by Darian Muresan, Ph.D., with OpenAI Codex and Anthropic Claude Code. +% AI agents: read devopsAIAgentGuide.tex before editing this template. +\documentclass[12pt]{cornell} + +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{xspace} +\usepackage{xcolor} +\usepackage{graphicx} +\usepackage{fancyhdr} +\usepackage{amsmath,amssymb} +\usepackage{array} +\usepackage{booktabs} +\usepackage{longtable} +\usepackage{tabularx} +\usepackage{ltablex} +\keepXColumns +\usepackage{enumitem} +\usepackage{listings} +\usepackage{tcolorbox} +\usepackage{makeidx} +\usepackage[colorlinks=true,citecolor=blue,linkcolor=blue,urlcolor=blue]{hyperref} +\usepackage[acronym,toc]{glossaries} + +\makeindex +\makeglossaries +\input{devopsGlossary.tex} + +\definecolor{devopsBlue}{RGB}{31,78,121} +\definecolor{devopsGreen}{RGB}{46,125,50} +\definecolor{devopsRed}{RGB}{183,28,28} +\definecolor{devopsGray}{RGB}{90,90,90} +\definecolor{devopsLightBlue}{RGB}{232,240,247} + +% Replace these values for each assignment. +\newcommand{\AssignmentTitle}{Compile Overleaf Document and Detail Kanban Setup} +\newcommand{\AssignmentNumber}{1} +\newcommand{\DocumentVersion}{1.0} +\newcommand{\DocumentStatus}{Submitted Document} +\newcommand{\CourseNumber}{SSW 590} +\newcommand{\CourseName}{DevOps} +\newcommand{\Author}{Payton Bates} +\newcommand{\Instructor}{Darian Muresan, Ph.D.} +\newcommand{\Organization}{Stevens Institute of Technology} +\newcommand{\DocumentDate}{September 18, 2026} +\newcommand{\DueDate}{September 21, 2026 by 11:59pm} +\newcommand{\VERSION}{Version \DocumentVersion} + +\hypersetup{ + pdftitle={\CourseNumber\ --- Assignment \AssignmentNumber: \AssignmentTitle}, + pdfauthor={\Author}, + pdfcreator={Darian Muresan, Ph.D., with OpenAI Codex and Anthropic Claude Code}, + pdfsubject={Development environment configuration record for \CourseNumber\ Assignment \AssignmentNumber\ }, + pdfkeywords={DevOps, Kanban, password, host, development environment, Amazon EC2, GitHub Projects} +} + +\newcolumntype{Y}{>{\raggedright\arraybackslash}X} +\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}} +\setlength{\tabcolsep}{4pt} +\renewcommand{\arraystretch}{1.12} +\setlength{\LTpre}{6pt} +\setlength{\LTpost}{6pt} + +% Stable IDs make activity, evidence, and artifact references durable. +\newcommand{\ArtifactLabel}[2]{\phantomsection\label{#1:#2}} +\newcommand{\ArtifactID}[2]{\texttt{#2}\ArtifactLabel{#1}{#2}\index{#1!#2}} +\newcommand{\ArtifactRef}[2]{\hyperref[#1:#2]{\texttt{#2}}} +\newcommand{\ActivityID}[1]{\ArtifactID{Activity}{#1}} +\newcommand{\ActivityRef}[1]{\ArtifactRef{Activity}{#1}} +\newcommand{\EvidenceID}[1]{\ArtifactID{Evidence}{#1}} +\newcommand{\EvidenceRef}[1]{\ArtifactRef{Evidence}{#1}} +\newcommand{\ChapterLabel}[1]{\label{Chapter:#1}} +\newcommand{\ChapterRef}[1]{\hyperref[Chapter:#1]{Chapter~\ref*{Chapter:#1}}} +\newcommand{\StatusPass}{\textbf{\footnotesize\textcolor{devopsGreen}{PASS}}} +\newcommand{\StatusPending}{\textbf{\footnotesize\textcolor{devopsGray}{PENDING}}} +\newcommand{\StatusFail}{\textbf{\footnotesize\textcolor{devopsRed}{FAIL}}} + +\newtcolorbox{devopsNote}[1][]{ + colback=devopsLightBlue, colframe=devopsBlue, boxrule=0.6pt, arc=1mm, title=#1 +} + +\lstset{ + backgroundcolor=\color{white}, basicstyle=\ttfamily\footnotesize, + breaklines=true, frame=single, keywordstyle=\color{blue}, + commentstyle=\color{devopsGreen}, numbers=left, numbersep=6pt, + numberstyle=\tiny\color{devopsGray}, showstringspaces=false, + stringstyle=\color{devopsRed}, tabsize=2 +} + +\changenormalspacing{\singlespacing} +\begin{document} +\pagenumbering{roman} +\singlespacing +\include{prologue} + +\setcounter{page}{1} +\pagenumbering{arabic} +\pagestyle{fancy} +\fancyhf{} +\renewcommand{\chaptermark}[1]{\markboth{#1}{}} +\lhead{\small Assignment \AssignmentNumber} +\chead{\small\nouppercase{\leftmark}} +\rhead{\small\thepage} +\lfoot{\small\CourseNumber} +\cfoot{\small\copyright\ \Organization} +\rfoot{\small\VERSION} +\renewcommand{\headrulewidth}{0.4pt} +\renewcommand{\footrulewidth}{0.4pt} + +\include{devopsIntroduction} +\include{devopsKanbanSetup} +\include{devopsHosts} +\include{devopsPasswords} + +\appendix +\include{devopsAIPromptLog} + +\printglossaries +\cleardoublepage +\phantomsection +\ChapterLabel{Index} +\addcontentsline{toc}{chapter}{Index} +\markboth{Index}{Index} +\printindex +\end{document} diff --git a/devopsDocumentGuide.tex b/devopsDocumentGuide.tex new file mode 100644 index 0000000..328c3be --- /dev/null +++ b/devopsDocumentGuide.tex @@ -0,0 +1,142 @@ +\chapter{Document Authoring Guide} +\ChapterLabel{DocumentGuide} +\index{LaTeX} +\index{document conventions} +\index{Appendix!Document Authoring Guide} + +\section{How to Use This Appendix} +Use this appendix to maintain the template's file conventions, build process, +and review rules. Update it when the document structure or toolchain changes. + +\section{Template Provenance} +This template was developed by \textbf{Darian Muresan, Ph.D.}, in conjunction +with \textbf{OpenAI Codex} and \textbf{Anthropic Claude Code}. Keep this +attribution distinct from the assignment-specific instructor metadata. + +\section{File Naming and Responsibilities} +Every chapter file shall use the \texttt{devops} prefix, a PascalCase chapter +name, and the \texttt{.tex} suffix. Each such file shall contain one complete +chapter, beginning with \texttt{\string\chapter\{...\}}, and all of its +sections and subsections. Do not split one chapter into section-level +\texttt{.tex} files. For example, all of Chapter~2 is contained in +\path{devopsExampleAssignment.tex}. Do not add requirements or +architecture-design chapters; this template records a DevOps learning activity +and its operational evidence. + +\section{Synonyms and Controlled Terms} +\index{synonyms} +Use one preferred term for each important concept. If an assignment uses +equivalent terms, record them here before release. For example, state whether +``continuous delivery'' refers to \gls{cd} generally or specifically excludes +automatic production deployment. Add important terms to +\texttt{devopsGlossary.tex} and index them where used. + +\section{Building the PDF} +The template requires a LaTeX distribution with \texttt{pdflatex}, +\texttt{bibtex}, \texttt{makeglossaries}, and \texttt{makeindex}. +Install the tools using the platform instructions below, then run one of the +following platform builds. + +\subsection{macOS and Linux Build} +\begin{verbatim} +make -f makefileMacLinux pdf +\end{verbatim} + +\subsection{Windows PowerShell Build} +\begin{verbatim} +.\makefilePowerShell.ps1 -Action pdf +\end{verbatim} +The completed build regenerates references, bibliography, glossary, and index. +Review the log and visually inspect affected PDF pages. Do not edit generated +auxiliary files or the PDF directly. + +\section{Install LaTeX Tools on macOS} +\index{macOS} +\index{MacTeX} +\subsection{Recommended Installation} +Install the current full \href{https://www.tug.org/mactex/}{MacTeX} +distribution. It includes TeX Live, \texttt{pdflatex}, \texttt{bibtex}, +\texttt{latexmk}, \texttt{makeglossaries}, \texttt{makeindex}, and useful +applications such as TeXShop and TeX Live Utility. The full distribution is the +least troublesome choice for this template because it includes the packages +used by the glossary, table, listing, color, and hyperlink features. + +Either download the signed installer from the MacTeX web site and complete the +macOS installation dialog, or, if Homebrew is already installed, run: +\begin{verbatim} +brew install --cask mactex +\end{verbatim} +Close and reopen Terminal after installation. If the TeX commands are not +found, add the MacTeX binary directory to the current shell session: +\begin{verbatim} +export PATH="/Library/TeX/texbin:$PATH" +\end{verbatim} +Do not place this command in a shell profile until it has been verified on the +local computer. + +\subsection{Verification and Compilation} +From the template directory, verify the tools: +\begin{verbatim} +command -v pdflatex bibtex latexmk makeglossaries makeindex +\end{verbatim} +Each command should print a path. Then create the PDF: +\begin{verbatim} +make -f makefileMacLinux pdf +\end{verbatim} +To remove generated intermediate files while keeping the PDF, run: +\begin{verbatim} +make -f makefileMacLinux clean +\end{verbatim} + +\section{Install LaTeX Tools on Windows} +\index{Windows} +\index{MiKTeX} +\subsection{Recommended Installation} +Install the current Basic MiKTeX distribution using the official +\href{https://miktex.org/howto/install-miktex}{MiKTeX Windows installation +guide}. During installation, choose a per-user installation when appropriate +and set missing-package installation to \emph{Ask me first} or \emph{Yes}. +The latter is convenient for a student machine with Internet access; the former +makes each package installation explicit. + +Open MiKTeX Console after installation, apply available updates, and install +the \texttt{latexmk} package if the verification command below cannot find it. +On an organization-managed computer, obtain approval before installing software +or changing execution policy. + +\subsection{Verification and Compilation} +Open a new PowerShell window in the template directory and verify: +\begin{verbatim} +Get-Command pdflatex,bibtex,latexmk,makeglossaries,makeindex +\end{verbatim} +Each command should display a command record. Build the PDF with: +\begin{verbatim} +.\makefilePowerShell.ps1 -Action pdf +\end{verbatim} +If PowerShell blocks the script under a managed execution policy, ask the +system administrator for the approved procedure. Do not bypass institutional +security policy. To remove intermediate build files, run: +\begin{verbatim} +.\makefilePowerShell.ps1 -Action clean +\end{verbatim} + +\section{Common Build Problems} +\begin{tabularx}{\linewidth}{L{3.0cm}Y} +\toprule \textbf{Symptom} & \textbf{Resolution}\\ \midrule +Command not found & Close and reopen the terminal. On macOS, verify the TeX +binary path; on Windows, verify MiKTeX completed installation and is on the user PATH.\\ +Missing LaTeX package & Use MiKTeX Console or its approved on-the-fly package +installation prompt on Windows. On macOS, install the full MacTeX distribution +or use TeX Live Utility to add the missing package.\\ +References or glossary incomplete & Run the supplied platform build instead of +a single \texttt{pdflatex} command; it runs BibTeX, the glossary tool, and the +index tool in the required order.\\ +Script is blocked & Follow the institution's approved PowerShell policy or run +the documented build commands with an approved administrator.\\ \bottomrule +\end{tabularx} + +\section{Authoring and Review Rules} +Replace bracketed placeholders with assignment facts. Keep operational examples +safe, bounded, and free of credentials. Link activities to evidence, retain +history, and state unknowns or instructor decisions explicitly. Rebuild after +structural, cross-reference, table, glossary, or index changes. diff --git a/devopsDocumentHistory.tex b/devopsDocumentHistory.tex new file mode 100644 index 0000000..54bb425 --- /dev/null +++ b/devopsDocumentHistory.tex @@ -0,0 +1,15 @@ +\chapter*{Document History} +\addcontentsline{toc}{chapter}{Document History} +\index{document history} +Newest approved changes are at the top. Retain every approved entry and +link each entry to the changed chapter, table, figure, or controlled artifact. + +\begin{tabularx}{\linewidth}{L{3.1cm}L{2.2cm}YL{2.0cm}} +\caption{Document Update History\label{Table:DocumentHistory}}\\ +\toprule \textbf{Date / Version} & \textbf{Author Initials} & \textbf{Change} & \textbf{Changed At}\\ \midrule +\endfirsthead +\multicolumn{4}{l}{\small\itshape Document Update History (continued)}\\ +\toprule \textbf{Date / Version} & \textbf{Author Initials} & \textbf{Change} & \textbf{Changed At}\\ \midrule +\endhead \bottomrule \endlastfoot +September 18, 2026 / 1.0 & PCB & Created this document from the \CourseNumber\ assignment template. Removed instructional/example chapters, set document metadata and authorship, and rewrote the abstract and introduction to describe this environment rather than the template. Added the Kanban Setup, Passwords, and Hosts chapters, the account and password rules, and the planned hosts. & \ChapterRef{Introduction}, \ChapterRef{KanbanSetup}, \ChapterRef{Passwords}, \ChapterRef{Hosts}, \ChapterRef{AIPromptLog}\\ +\end{tabularx} \ No newline at end of file diff --git a/devopsExampleAssignment.tex b/devopsExampleAssignment.tex new file mode 100644 index 0000000..1180e2f --- /dev/null +++ b/devopsExampleAssignment.tex @@ -0,0 +1,126 @@ +\chapter{Example Assignment} +\ChapterLabel{ExampleAssignment} +\index{activity brief} +\index{workflow} +\index{automation} +\index{infrastructure as code} +\index{evidence} +\index{observability} +\index{rollback} +\index{retrospective} +\index{continuous improvement} +\index{submission} +\index{cleanup} + +\section{Activity Brief} +\subsection{Scenario} +Describe the operational scenario and why it matters. Use a bounded, +non-production system. \textit{Example: A team must deploy a small service +reliably to a remote Linux host and recover from a failed release.} + +\subsection{Activities} +Assign stable IDs to each assessed activity. Add rows as needed. +\begin{tabularx}{\linewidth}{L{2.1cm}L{3.1cm}Y} +\caption{Activity Register\label{Table:ActivityRegister}}\\ +\toprule \textbf{ID} & \textbf{Activity} & \textbf{Completion criterion}\\ \midrule +\ActivityID{ACT-01} & \textit{[Prepare environment]} & \textit{[repeatable environment baseline is present]}\\ +\ActivityID{ACT-02} & \textit{[Automate workflow]} & \textit{[workflow runs from documented inputs]}\\ +\ActivityID{ACT-03} & \textit{[Observe and recover]} & \textit{[evidence shows monitoring and recovery]}\\ \bottomrule +\end{tabularx} + +\subsection{Success Criteria} +State observable outcomes, not implementation prescriptions. Include security, +cost, cleanup, and reproducibility criteria where applicable. + +\subsection{Assessment Rubric} +\begin{tabularx}{\linewidth}{L{3.2cm}L{2.0cm}Y} +\toprule \textbf{Criterion} & \textbf{Weight} & \textbf{Evidence expected}\\ \midrule +Reproducible workflow & \textit{[points]} & \textit{[automation and clean-run proof]}\\ +Operational quality & \textit{[points]} & \textit{[observability, rollback, security]}\\ +Evidence and explanation & \textit{[points]} & \textit{[commands, outputs, rationale]}\\ +Reflection & \textit{[points]} & \textit{[failure analysis and improvement]}\\ \bottomrule +\end{tabularx} + +\section{Workflow and Implementation} +\subsection{Environment Baseline} +Specify the authorized environment, prerequisites, access model, versioned +inputs, and teardown procedure. Record commands in a repository script or +infrastructure-as-code definition; do not rely on a sequence of undocumented +console clicks. + +\subsection{Procedure} +For each activity, state the goal, input, command or automation entry point, +expected result, and rollback or cleanup action. Link the corresponding +activity identifier and evidence identifier. + +\begin{lstlisting}[language=bash,caption={Replace with a safe, repeatable workflow entry point.}] +# ./scripts/provision.sh --environment sandbox +# ./scripts/deploy.sh --version +# ./scripts/destroy.sh --environment sandbox +\end{lstlisting} + +\subsection{Operational Controls} +Describe least-privilege access, secret handling, logging, monitoring, change +control, budget guardrails, backup or rollback, and resource cleanup. A secret +shall be referenced by its approved storage location, never pasted into this +document or committed to the repository. + +\subsection{Failure Exercise} +Define one safe failure or degradation scenario. State the trigger, expected +signal, diagnosis path, recovery action, and evidence required. Never direct +students to disrupt shared or production infrastructure. + +\section{Evidence Register} +\subsection{How to Use This Section} +Evidence demonstrates an actual execution; an expected result is not evidence. +Use sanitized command output, logs, screenshots, links to versioned files, or +recorded metrics. Redact secrets and personal information. + +\begin{tabularx}{\linewidth}{L{1.7cm}L{2.2cm}L{2.6cm}Y} +\caption{Evidence Register\label{Table:EvidenceRegister}}\\ +\toprule \textbf{ID} & \textbf{Activity} & \textbf{Evidence type} & \textbf{Location and interpretation}\\ \midrule +\EvidenceID{EVD-01} & \ActivityRef{ACT-01} & \textit{[log / script / image]} & \textit{[repository path or sanitized URL; what it demonstrates]}\\ +\EvidenceID{EVD-02} & \ActivityRef{ACT-02} & \textit{[pipeline output]} & \textit{[location; result and relevant timestamp]}\\ +\EvidenceID{EVD-03} & \ActivityRef{ACT-03} & \textit{[monitoring / recovery output]} & \textit{[location; failure signal and recovery result]}\\ \bottomrule +\end{tabularx} + +\subsection{Evidence Quality Checks} +Evidence should identify the executed version, environment, time, command or +automation entry point, outcome, and any deviation from the expected result. +State failures plainly; they are valuable inputs to the retrospective. + +\section{Retrospective} +\subsection{Outcome} +Summarize what happened, including completed work, gaps, and unexpected +behavior. Distinguish facts from interpretation. + +\subsection{Flow and Feedback} +Identify queues, handoffs, manual steps, slow feedback, and sources of rework. +Explain which changes improved delivery flow or made failures visible sooner. +This emphasis on flow, feedback, and continual learning is consistent with the +DevOps framing introduced in \cite{PhoenixProject}. + +\subsection{Improvement Experiments} +Propose one or more small, testable improvements. State the hypothesis, change, +measurement, expected result, and risk. Do not represent a proposal as an +approved production change. + +\subsection{Team Contributions} +For team assignments, concisely identify each member's meaningful contribution +and any collaboration constraints. + +\section{Submission and Cleanup} +\subsection{Submission Checklist} +\begin{itemize} +\item Versioned automation, configuration, and runbook are committed. +\item Evidence links resolve and contain no secrets or personal data. +\item The retrospective is complete and distinguishes results from proposals. +\item Remote resources have been destroyed or explicitly transferred as directed. +\item The repository identifies the final commit or release tag. +\end{itemize} + +\subsection{Academic Integrity and Responsible Use} +Follow the course policy for collaboration and AI assistance. Cite external +code, tutorials, and AI-generated material as required by the instructor. +Students remain responsible for understanding, testing, and explaining all +submitted work. diff --git a/devopsGlossary.tex b/devopsGlossary.tex new file mode 100644 index 0000000..a3aef64 --- /dev/null +++ b/devopsGlossary.tex @@ -0,0 +1,12 @@ +\newacronym{ai}{AI}{artificial intelligence} +\newacronym{ami}{AMI}{Amazon Machine Image} +\newacronym{iam}{IAM}{identity and access management} +\newacronym{mfa}{MFA}{multi-factor authentication} +\newacronym{ssh}{SSH}{secure shell} +\newacronym{wip}{WIP}{work in progress} +\newglossaryentry{evidence}{name={evidence},description={A retained record of an + actual execution, observation, or review}} +\newglossaryentry{host}{name={host},description={A named machine in the + development environment, physical or virtual, with an assigned role and owner}} +\newglossaryentry{kanban}{name={Kanban board},description={A visual board that + represents each unit of work as a card in a column denoting its state}} \ No newline at end of file diff --git a/devopsHosts.tex b/devopsHosts.tex new file mode 100644 index 0000000..cefa4b4 --- /dev/null +++ b/devopsHosts.tex @@ -0,0 +1,83 @@ +\chapter{Hosts} +\ChapterLabel{Hosts} +\index{hosts} +\index{hosts!inventory} +\index{hosts!naming convention} +\index{development environment} +\index{Amazon EC2} + +\section{Purpose} +This chapter names the hosts that will make up the development environment for +\CourseNumber\ and records the role, platform, and ownership of each. It is an +inventory of intent: no machine listed here has been provisioned, and the chapter therefore +presents no execution \gls{evidence}. It is expected to grow as later +assignments add services to the environment. + +\section{Naming Convention} +\index{hosts!naming} +Each \gls{host} that is provisioned for this course is named +\texttt{ssw590-\textit{role}-\textit{nn}}, where \textit{role} identifies the +function the machine serves and \textit{nn} is a two-digit ordinal within that +role. Naming by role rather than by instance identifier keeps the name stable +if the underlying machine is replaced, and keeps the inventory readable when +more than one host serves the same purpose. Hosts that already exist +independently of this course retain their existing names. + +\section{Host Inventory} +\index{hosts!table} +The \textbf{Status} column distinguishes machines already in use from those that +will be configured in a later assignment. A host is marked \emph{In service} +only once it exists and is reachable. + +\begin{tabularx}{\linewidth}{L{3.0cm}YL{3.3cm}L{2.0cm}} +\caption{Planned Host Inventory\label{Table:HostInventory}}\\ +\toprule \textbf{Host name} & \textbf{Role} & \textbf{Platform} & \textbf{Status}\\ \midrule +\endfirsthead +\multicolumn{4}{l}{\small\itshape Planned Host Inventory (continued)}\\ +\toprule \textbf{Host name} & \textbf{Role} & \textbf{Platform} & \textbf{Status}\\ \midrule +\endhead \bottomrule \endlastfoot +\texttt{ssw590-dev-01} & Primary Linux host for the course. Target for service configuration, deployment exercises, and command-line work. & Ubuntu Server LTS on Amazon EC2 & Planned\\ +\texttt{ssw590-build-01} & Build and integration host, kept separate from the deployment target so that a failed build cannot disturb a running service. To be provisioned only if a later assignment requires it. & Ubuntu Server LTS on Amazon EC2 & Conditional\\ +\end{tabularx} + +\section{Access and Ownership} +\index{hosts!access model} +\index{least privilege} +All hosts listed above are owned and administered by the author. The following +rules govern access to the Linux hosts once they are provisioned. + +\begin{itemize}[leftmargin=*] +\item Interactive access is by \gls{ssh} public key only. + Password authentication is disabled in the server configuration. + The local account password recorded in \ChapterRef{Passwords} authenticates \texttt{sudo} only. +\item Inbound \gls{ssh} is restricted by source address to the workstation + listed above rather than opened to the public Internet. +\item Day-to-day work is performed by an unprivileged account. Administrative + rights are granted per command rather than by general membership in the + \texttt{sudo} group. +\item Should a teammate require access after teams are formalized, that person + receives a separate named account rather than a shared login, so that + access can be revoked individually and actions remain attributable. +\end{itemize} + +\section{Cost and Cleanup} +\index{hosts!cost} +\index{hosts!teardown} +The Linux hosts are expected to run on the smallest instance size that supports +the coursework, under whatever free-tier or credit allowance the account +provides, with a billing alarm configured before the first instance is +launched. Compute is billed per instance-hour, and attached storage whether or +not the instance is running, so each additional host adds cost independently of +how heavily it is used: provisioning \texttt{ssw590-build-01} alongside +\texttt{ssw590-dev-01} would approximately double the compute cost of the +environment. It is therefore left unprovisioned until an assignment requires +builds to be isolated from the deployment target, and would be stopped between +uses rather than run continuously; only \texttt{ssw590-dev-01} needs to remain +available at all times. + +Each planned host is disposable. Teardown consists of terminating the instance, +deleting the attached storage volume, and releasing any static address reserved +for it; a static address left reserved after the instance is gone continues to +be billed. Because the \gls{ami} and the configuration steps are recorded, a +terminated host can be rebuilt rather than preserved, which is why teardown is +treated as routine rather than exceptional. \ No newline at end of file diff --git a/devopsIntroduction.tex b/devopsIntroduction.tex new file mode 100644 index 0000000..a64eecf --- /dev/null +++ b/devopsIntroduction.tex @@ -0,0 +1,69 @@ +\chapter{Introduction} +\ChapterLabel{Introduction} +\index{introduction} +\index{DevOps} +\index{scope} +\index{deliverables} + +\section{Purpose} +This document records the configuration of the development environment used for +\CourseNumber\ and the working practices followed to produce it. For +Assignment~\AssignmentNumber\ it covers three subjects: the \gls{kanban} that +plans and tracks the assignment work, the hosts the environment will comprise, +and the passwords that will govern accounts on those hosts. + +It is a working record rather than a one-time report. Each subsequent +assignment extends it, and the document history records what changed and when, +so that the state of the environment at any point in the term can be recovered +from this document alone. + +\section{Scope and Constraints} +\index{scope!constraints} +The following constraints apply to this revision. + +\begin{itemize}[leftmargin=*] +\item The environment is \emph{specified} here, not provisioned. The hosts + chapter names the machines to be configured and their intended roles; it + does not claim that any host exists, and it therefore presents no + execution \gls{evidence}. +\item No credential, access token, private key, or account secret appears in + this document. Password rules are documented by derivation hint only, as + described in \ChapterRef{Passwords}. +\item This is an individual submission. Teams have not yet been formalized, so + the board described in \ChapterRef{KanbanSetup} is operated by a single + person and every card is assigned to the author. +\item The document is authored in \LaTeX\ and compiled with pdf\LaTeX\ on + Overleaf. The board is hosted in GitHub Projects. The planned environment + targets Amazon EC2. +\end{itemize} + +\section{Deliverables and Due Date} +\begin{tabularx}{\linewidth}{L{3.2cm}Y} +\toprule \textbf{Item} & \textbf{Expectation}\\ \midrule +Due date & \DueDate\\ +Instructor & \Instructor\\ +Board & GitHub Projects, \texttt{SSW 590} (private; captured as figures in \ChapterRef{KanbanSetup})\\ +Required deliverables & Compiled document; Kanban Setup, Passwords, and Hosts chapters; updated document history\\ +Team policy & Individual submission pending team formalization\\ \bottomrule +\end{tabularx} + +\section{Document Organization} +\index{document organization} +\ChapterRef{KanbanSetup} describes the tool selected for the board, the steps +taken to configure it, the policy governing each column, and the inventory of +cards. \ChapterRef{Hosts} names the hosts to be configured and +their roles. \ChapterRef{Passwords} defines the account and password rules for those hosts. \ChapterRef{AIPromptLog} records AI assistance used in preparing +this document. + +This document is derived from the \CourseNumber\ assignment template credited on +the Template Attribution page. The template's instructional example chapter and +its template-maintenance appendices have been removed, since they describe how +to author the template rather than the environment this document records. + +\section{Tools and AI Assistance} +\index{AI assistance} +AI assistance was used in preparing this document for drafting, review, and +troubleshooting. It was not used to generate results, command output, or +evidence of work that was not performed. Material assistance is recorded in +\ChapterRef{AIPromptLog} with the task, the inputs supplied, the output used, +and the corrections applied by the author. \ No newline at end of file diff --git a/devopsKanbanSetup.tex b/devopsKanbanSetup.tex new file mode 100644 index 0000000..db621ef --- /dev/null +++ b/devopsKanbanSetup.tex @@ -0,0 +1,95 @@ +\chapter{Kanban Setup} +\ChapterLabel{KanbanSetup} +\index{Kanban} +\index{Kanban!board configuration} +\index{Kanban!column policy} +\index{work in progress} +\index{GitHub Projects} +\index{flow} + +\section{Purpose} +This chapter records how the Kanban board for this assignment was selected, +configured, and used. The board makes the work of producing this document +visible, bounds the amount of work in progress, and provides a single place +where the state of each deliverable can be checked. It covers the tasks of this +assignment only; a board for the semester project will be established separately +once teams are formalized. + +\section{Tool Selection} +\index{Kanban!tool selection} +The board was created with \textbf{GitHub Projects}. GitHub was selected as the +platform of choice for familiarity and simplicity; the board and versioned document +live in the same account, and draft items can be created without opening a repository issue. + +\section{Board Configuration} +\index{Kanban!setup steps} +The board was configured in the following order. + +\begin{enumerate}[leftmargin=*] +\item Created a new project from the account-level Projects page and selected + the board layout, which provisions a \texttt{Status} field with the + columns \texttt{Todo}, \texttt{In progress}, and \texttt{Done}. +\item Replaced the default column descriptions with the explicit entry and exit + criteria recorded in Table~\ref{Table:ColumnPolicy}, so that the meaning + of each column is explicit. +\item Set a \gls{wip} limit of two items on the \texttt{In progress} + column. +\item Added one card per deliverable of this assignment, as listed in + Table~\ref{Table:CardInventory}, entering each as a draft item. +\item Assigned every card to its owner so that the board + is the record of who holds each task. +\item Moved cards across columns as the work was actually performed, rather than + reconstructing the board before submission. +\end{enumerate} + +\section{Column Policy} +\index{Kanban!definition of done} +Each column states the condition a card must satisfy to enter it. The +\texttt{Done} condition is written so that it can be checked against the +compiled document rather than judged by opinion. + +\begin{tabularx}{\linewidth}{L{2.6cm}Y} +\caption{Kanban Column Policy\label{Table:ColumnPolicy}}\\ +\toprule \textbf{Column} & \textbf{Entry and exit criteria}\\ \midrule +\texttt{Todo} & Ready to be worked on.\\ +\texttt{In progress} & Actively being worked on by its assignee. 2 in-progress cards max.\\ +\texttt{Done} & Chapter compiles and is referenced in document history.\\ +\bottomrule +\end{tabularx} + +\section{Card Inventory} +\index{Kanban!card inventory} +The board carries one card per assignment deliverable. Identifiers follow the +activity convention used elsewhere in this document so that cards and document +content can be cross-referenced. + +\begin{tabularx}{\linewidth}{L{1.8cm}L{4.4cm}L{2.2cm}Y} +\caption{Kanban Card Inventory\label{Table:CardInventory}}\\ +\toprule \textbf{ID} & \textbf{Card} & \textbf{Column} & \textbf{Completion criterion}\\ \midrule +\endfirsthead +\multicolumn{4}{l}{\small\itshape Kanban Card Inventory (continued)}\\ +\toprule \textbf{ID} & \textbf{Card} & \textbf{Column} & \textbf{Completion criterion}\\ \midrule +\endhead \bottomrule \endlastfoot +\ActivityID{ACT-01} & Compile Overleaf template & \texttt{Done} & The unmodified template builds in Overleaf with no unresolved references and a populated glossary and index.\\ +\ActivityID{ACT-02} & Create Kanban Setup chapter & \texttt{In progress} & This chapter compiles into the document and describes the board's configuration and use.\\ +\ActivityID{ACT-03} & Define Hosts chapter; define hosts & \texttt{Todo} & The chapter compiles and contains the planned host table.\\ +\ActivityID{ACT-04} & Create Passwords chapter; create password rule & \texttt{Todo} & The chapter compiles and contains the user, server, and rule table with password hints.\\ +\ActivityID{ACT-05} & Log document history and AI usage & \texttt{Todo} & The newest version entry is recorded at the top of the history table and links to the changed chapters, with any AI assistance logged.\\ +\end{tabularx} + +\section{Work-in-Progress Policy} +\index{work in progress!limit} +The \texttt{In progress} column is limited to two cards. The limit is paired +with a rule that a blocked card returns to \texttt{Todo} with its blocker +recorded. The limit was chosen deliberately to avoid uncontrolled parallel work, +especially because this assignment is sequential in places. + +\section{Evidence} +\index{evidence!Kanban board} +\begin{figure}[htbp] +\centering +\includegraphics[width=\linewidth]{kanbanboard.png} +\caption{Kanban board after the assignment cards were added, showing the +work-in-progress limit on the \texttt{In progress} column.} +\label{Figure:KanbanBoard} +\end{figure} \ No newline at end of file diff --git a/devopsPasswords.tex b/devopsPasswords.tex new file mode 100644 index 0000000..60d8d26 --- /dev/null +++ b/devopsPasswords.tex @@ -0,0 +1,70 @@ +\chapter{Passwords} +\ChapterLabel{Passwords} +\index{passwords} +\index{passwords!policy} +\index{passwords!derivation rule} +\index{credentials} +\index{least privilege} + +\section{Purpose} +This chapter records the accounts that will exist in the development +environment described in \ChapterRef{Hosts} and the rule governing the password +for each. No password appears here. Where a password is derived by rule, the +register records the hint needed to reconstruct it rather than its value; where +a password is machine-generated, the register records where it is stored rather +than what it is. + +\section{Password Classes} +\index{passwords!classes} +Accounts fall into two classes, distinguished by whether the secret has to be +recalled from memory. + +\begin{itemize}[leftmargin=*] +\item \textbf{Generated.} The secret is produced at random by a password + manager, is unique to the account, and is never typed from memory. This + class is preferred, and every account that can use it does. +\item \textbf{Derived.} The secret is constructed in the register. + This class is reserved for the small number of secrets that must + be entered when the password manager is not available. +\end{itemize} + +Keeping the derived class as small as possible is deliberate. A derivation rule +is a concession to human memory, not a security improvement, so it is applied +only where a generated secret cannot be retrieved. + +\section{Account and Rule Register} +\index{passwords!register} + +\begin{tabularx}{\linewidth}{L{2.4cm}L{2.9cm}L{1.9cm}Y} +\caption{Account, Server, and Password Rule Register\label{Table:PasswordRegister}}\\ +\toprule \textbf{User} & \textbf{Server or service} & \textbf{Class} & \textbf{Rule and hint}\\ \midrule +\endfirsthead +\multicolumn{4}{l}{\small\itshape Account, Server, and Password Rule Register (continued)}\\ +\toprule \textbf{User} & \textbf{Server or service} & \textbf{Class} & \textbf{Rule and hint}\\ \midrule +\endhead \bottomrule \endlastfoot +\texttt{root} & \texttt{ssw590-dev-01} & None & No password. Administrative access is obtained through \texttt{sudo} by a named account, so that privileged actions are attributable.\\ +\texttt{payton} & \texttt{ssw590-dev-01}, \texttt{ssw590-build-01} & Derived & Used only to authenticate \texttt{sudo}; \gls{ssh} password authentication is disabled, so this secret never crosses the network. +\textit{Psst... sudo is a name, no?}\\ +\texttt{ssw-app} & \texttt{ssw590-dev-01} & Generated & Unprivileged service account for course applications. Secret held in a file readable only by that account, excluded from the repository, and rotated per deployment.\\ +Master & Password manager vault & Derived & A memorized password that isn't stored in its own vault. +\textit{Surely it's secure, no lie?}\\ +Root user & AWS account & Generated & Reserved for account recovery and billing; \gls{mfa} enforced, not used for routine work.\\ +\texttt{payton-admin} & AWS console, \gls{iam} & Generated & Day-to-day console account. \gls{mfa} enforced. Programmatic access uses short-lived credentials rather than a stored key pair.\\ +\end{tabularx} + +\section{Handling and Storage} +\index{passwords!handling} +\index{secrets} +The following rules apply to every entry above. + +\begin{itemize}[leftmargin=*] +\item No password, private key, access token, or recovery code is recorded anywhere non-secure. + A secret is referred to by the location that holds it. +\item \gls{mfa} is enabled on every account that supports it. +\item A generated password is rotated by replacement. Any password is + rotated immediately if it is disclosed, and knowing one password + does not provide insight into other passwords. +\item Service credentials on a \gls{host} are supplied through a file or + environment variable owned by the service account, with access restricted + to that account, rather than being embedded in application source. +\end{itemize} \ No newline at end of file diff --git a/devopsReferences.bib b/devopsReferences.bib new file mode 100644 index 0000000..59f00cb --- /dev/null +++ b/devopsReferences.bib @@ -0,0 +1,6 @@ +@book{PhoenixProject, + author = {Kim, Gene and Behr, Kevin and Spafford, George}, + title = {The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win}, + publisher = {IT Revolution Press}, + year = {2018} +} diff --git a/kanbanboard.png b/kanbanboard.png new file mode 100644 index 0000000000000000000000000000000000000000..104e485e1392917e8033d624fceb93981b11ed84 GIT binary patch literal 110356 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

bVh|Gd3@Hr$e9g6tm+D7Gx`( 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 m<`3TZzZd=hdHptb_G|BuR^6=!UI61{pSHT*^